第1页共29页钱晓捷新版汇编语言程序设计习题答案第一章汇编语言基础知识1.1、简述计算机系统的硬件组成及各部分作用1.2、明确下列概念或符号:主存和辅存,RAM和ROM,存储器地址和I/O端口,KB、MB、GB和TB1.3、什么是汇编语言源程序、汇编程序、目标程序?1.4、汇编语言与高级语言相比有什么优缺点?1.5、将下列十六进制数转换为二进制和十进制表示(1)FFH(2)0H(3)5EH(4)EFH(5)2EH(6)10H(7)1FH(8)ABH1.6、将下列十进制数转换为BCD码表示(1)12(2)24(3)68(4)127(5)128(6)255(7)1234(8)24581.7、将下列BCD码转换为十进制数(1)10010001(2)10001001(3)00110110(4)10010000(5)00001000(6)10010111(7)10000001(8)000000101.8、将下列十进制数分别用8位二进制数的原码、反码和补码表示(1)0(2)-127(3)127(4)-57(5)126(6)-126(7)-128(8)681.9、完成下列二进制数的运算(1)1011+1001(2)1011-1001(3)1011×1001(4)10111000÷1001(5)1011∧~1011(8)1011⊕10011001(6)1011∨1001(7)1.10数码0~9、大写字母A~Z、小写字母a~z对应的ASCII码分别是多少?ASCII码为0dh、0ah对应的是什么字符?1.11、计算机中有一个“01100001”编码,如果把它认为是无符号数,它是10进制什么数?如果认为它是BCD码,则表示什么数?又如果它是某个ASCII码,则代表哪个字符?1.12、简述Intel80x86系列微处理器在指令集方面的发展。1.13、什么是DOS和ROM-BIOS?1.14、简述PC机最低1MB主存空间的使用情况。1.15、罗列8086CPU的8个8位和16位通用寄存器,并说明各自的作用。1.16、什么是标志,它有什么用途?状态标志和控制标志有什么区别?画出标志寄存器FLAGS,说明各个标志的位置和含义。1.17、举例说明CF和OF标志的差异。第2页共29页溢出标志OF和进位标志CF是两个意义不同的标志进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确;溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确•例1:3AH+7CH=B6H无符号数运算:58+124=182,范围内,无进位有符号数运算:58+124=182,范围外,有溢出•例2:AAH+7CH=(1)26H无符号数运算:170+124=294,范围外,有进位有符号数运算:-86+124=28,范围内,无溢出1.18、字和双字在存储器中如何存放,什么是“小端方式”?对字和双字存储单元,什么是它们的对齐地址?为什么要对齐地址?1.19、什么是8086中的逻辑地址和物理地址?逻辑地址如何转换成物理地址?请将如下逻辑地址用物理地址表达:(1)FFFFh:0(2)40h:17h(3)2000h:4500h(4)B821h:4567h1.20、8086有哪4种逻辑段,各种逻辑段分别是什么用途?(解答)代码段(CodeSegment)用来存放程序的指令序列。处理器利用CS:IP取得下一条要执行的指令•堆栈段(StackSegment)确定堆栈所在的主存区域。处理器利用SS:SP操作堆栈中的数据•数据段(DataSegment)存放当前运行程序所用的数据。处理器利用DS:EA存取数据段中的数据•附加段(ExtraSegment)是附加的数据段,也用于数据的保存。处理器利用ES:EA存取数据段中的数据第二章8086指令系统2.1已知DS=2000H、BX=0100H、SI=0002H,存储单元[20100H]~[20103H]依次存放12345678H,[21200H]~[21203H]依次存放2A4CB765H,说明下列每条指令执行完后AX寄存器的内容。(1)movax,1200h;AX=1200h(2)movax,bx;AX=0100h(3)movax,[1200h];AX=4C2Ah(4)movax,[bx];AX=3412h(5)movax,[bx+1100h];AX=4C2Ah(6)movax,[bx+si];AX=7856h(7)movax,[bx][si+1100h];AX=65B7h2.2指出下列指令的错误(1)movcx,dl两操作数类型不匹配第3页共29页(2)movip,axIP指令指针禁止用户访问(3)moves,1234h立即数不允许传给段寄存器(4)moves,ds段寄存器之间不允许传送(5)moval,300两操作数类型不匹配(6)mov[sp],ax目的操作数应为[BP](7)movax,bx+di源操作数应为[BX+DI](8)mov20h,ah立即数不能作目的操作数2.3已知数字0~9对应的格雷码依次为:18H、34H、05H、06H、09H、0AH、0CH、11H、12H、14H,它存在于以table为首地址(设为200H)的连续区域中。请为如下程序段的每条指令加上注释,说明每条指令的功能和执行结果。leabx,table;获取table的首地址,BX=200Hmoval,8;传送欲转换的数字,AL=8xlat;转换为格雷码,AL=12H2.4什么是堆栈,它的工作原则是什么,它的基本操作有哪两个,对应哪两种指令?堆栈是一种按“先进后出”原则存取数据的存储区域。堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH和POP。2.5已知SS=FFA0H、SP=00B0H,画图说明执行下面指令序列时,堆栈区和SP的内容如何变化?movax,8057hpushaxmovax,0f79hpushaxpopbx;bx=0f79hpop[bx];DS:[0f79h]=8057h2.6给出下列各条指令执行后AL值,以及CF、ZF、SF、OF和PF的状态:第4页共29页moval,89hAL=89hCFZFSFOFPFaddal,alAL=12h10011addal,9dhAL=0afh00101cmpal,0bchAL=0afh10101subal,alAL=00h01001decalAL=0ffh00101incalAL=00h010012.7设X、Y、Z均为双字数据,分别存放在地址为X、X+2;Y、Y+2;Z、Z+2的存储单元中,它们的运算结果存入W单元。阅读如下程序段,给出运算公式。movax,Xmovdx,X+2addax,Yadcdx,Y+2addax,24adcdx,0subax,Zsbbdx,Z+2movW,axmovW+2,dxW=X+Y+24-Z2.8请分别用一条汇编语言指令完成如下功能:(1)把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器。ADDDX,BX(2)用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。ADDAL,[BX+SI](3)用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX寄存器的内容相加,并把结果送回存储器中。ADD[BX+0B2H],CX(4)用位移量为0520H的直接寻址方式把存储器中的一个字与数3412H相加,并把结果送回该存储单元中。ADDWORDPTR[0520H],3412H(5)把数0A0H与AL寄存器的内容相加,并把结果送回AL中。ADDAL,0A0H2.9;设X、Y、Z、V均为16位带符号数,分别装在X、Y、Z、V存储单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处。为了避免与操作数地址混淆,将题中X,Y,Z,V字操作数改为A,B,C,Dmovax,X;ax=AimulY;dx,ax=A*B(将操作数看作符号数,以下同)第5页共29页movcx,axmovbx,dx;bx,ax--dx,ax=A*Bmovax,Z;ax=Ccwd;dx,ax=C(扩展符号后为双字)addcx,axadcbx,dx;bx,cx--bx,cx+dx,ax=A*B+Csubcx,540sbbbx,0;bx,cx--A*B+C-540movax,V;ax=Dcwd;dx,ax=D(扩展符号后为双字)subax,cxsbbdx,bx;dx,ax=dx,ax-bx,cx=D-(A*B+C-540)idivX;运算结果:[D-(A*B+C-540h)]/A;ax存商,dx存余数2.10;(1)xchg[si],30hxchg的操作数不能是立即数(2)popcs不能对CS直接赋值(3)sub[si],[di]两个操作数不能都是存储单元(4)pushah堆栈的操作数不能是字节量(5)adcax,dsadc的操作数不能是段寄存器(6)add[si],80h没有确定是字节还是字操作(7)inal,3fchin不支持超过FFH的直接寻址(8)outdx,ahout只能以AL/AX为源操作数2.11;给出下列各条指令执行后的结果,以及状态标志CF、OF、SF、ZF、PF的状态。指令AX的值CFOFSFZFPFMovax,1407h1470h-----Andax,ax1470h00000Orax,ax1470h00000Xorax,ax000011Notax0ffffh-----Testax,0f0f0h0ffffh00101注意:1.mov,not指令不影响标志位2.其他逻辑指令使CF=OF=0,根据结果影响其他标志位。2.12;假设例题2.32的程序段中,AX=08H,BX=10H,请说明每条指令执行后的结果和各个标志位的状态。指令注释执行结果CFOFSFZFPF第6页共29页movsi,axsi=axsi=0008h-----shlsi,1si=2*axsi=0010h00000addsi,axsi=3*axsi=0018h00001movdx,bxdx=bxdx=0010h-----movcl,03hcl=03h-----shldx,cldx=8*bxdx=0080h0u000subdx,bxdx=7*bxdx=0070h00000adddx,sidx=7*bx+3*axdx=0088h00001注意:1.左移N次相当于乘于2的N次方,右左移N次相当于除乘于2的N次方。2.移位指令根据是否移入“1”到CF,设置CF,根据移位后的结果影响SF,ZF,PF。根据最高符号位是否改变设置OF,如改变OF=1.3.‘u’表示无定义,‘-’表示无影响。2.13编写程序段完成如下要求:(1)用位操作指令实现AL(无符号数)乘以10;不考虑进位movbl,almovcl,3shlal,claddal,bl;shlbl,1addal,bl;考虑进位xorah,ahmovbx,axmovcl,3shlax,claddax,bx;shlbx,1addax,bx(2)用逻辑运算指令实现数字0~9的ASCII码与非压缩BCD码的互相转换数字0~9的ASCII码是:30h~39h非压缩BCD码的0~9是:00h~09h方法一:andal,0fh;实现ASCII到非压缩BCD码的转换oral,30h;实现非压缩BCD码到ASCII的转换第7页共29页方法二:xoral,30h;求反D5D4位,其他不变;即高4位为3,则变为0;高4位为0,则变为3movcl,4again:shrdx,1;实现逻辑右移;采用“sardx,1”,则实现算术右移rcrax,1deccljnzagain(3)把DX:.AX中的双字右移4位MOVCL,4SHRAX,CLMOVBL,DLSHRDX,CLSHLBL,CLORAH,BL2.14;已知AL=F7H(表示有符号数-9),分别编写用SAR和IDIV指令实现的除以2的程序段,并说明各自执行后,所得的商是什么?(1)用sar编写moval,0f7h;-9送alsaral,1;结果:al=0fbh即-5(2)用idiv编写mova