汇编语言程序设计(第二版)钱晓捷习题答案第二章(01)2.1(1)AX=1200h(2)AX=0100h(3)AX=4C2Ah(4)AX=3412h(5)AX=4C2Ah(6)AX=7856h7)AX=65B7h(2.2(1)两操作数类型不匹配(2)IP指令指针禁止用户访问(3)立即数不允许传给段寄存器(4)段寄存器之间不允许传送(5)两操作数类型不匹配(6)目的操作数应为[BP](7)源操作数应为[BX+DI](8)立即数不能作目的操作数2.3leabx,table;获取table的首地址,BX=200Hmoval,8;传送欲转换的数字,AL=8xlat;转换为格雷码,AL=12H2.4堆栈是一种按“先进后出”原则存取数据的存储区域。堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH和POP。2.5movax,8057hpushaxmovax,0f79hpushaxpopbx;bx=0f79hpop[bx];DS:[0f79h]=8057h2.6AL=89hCFZFSFOFPFAL=12h10011AL=0afh00101AL=0afh10101AL=00h01001AL=0ffh00101AL=00h010012.7W=X+Y+24-Z课后答案网(1)ADDDX,BX(2)ADDAL,[BX+SI](3)ADD[BX+0B2H],CX(4)ADDWORDPTR[0520H],3412H(5)ADDAL,0A0H2.9;为了避免与操作数地址混淆,将题中X,Y,Z,V字操作数改为A,B,C,Dmovax,X;ax=AimulY;dx,ax=A*B(将操作数看作符号数,以下同)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的操作数不能是立即数(2不能对CS直接赋值(3)两个操作数不能都是存储单元(4)堆栈的操作数不能是字节量(5)adc的操作数不能是段寄存器(6)没有确定是字节还是字操作(7)in不支持超过FFH的直接寻址(8)out只能以AL/AX为源操作数第二章(02)2.11;指令AX的值CFOFSFZFPFMovax,1407h1470h-----Andax,ax1470h00000Orax,ax1470h00000Xorax,ax000011Notax0ffffh-----Testax,0f0f0h0ffffh00101注意:1.mov,not指令不影响标志位2.其他逻辑指令使CF=OF=0,根据结果影响其他标志位。课后答案网章(03)2.12;指令注释执行结果CFOFSFZFPFmovsi,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);不考虑进位movbl,almovcl,3shlal,claddal,bl;shlbl,1addal,bl;考虑进位xorah,ahmovbx,axmovcl,3shlax,claddax,bx;shlbx,1addax,bx(2)数字0~9的ASCII码是:30h~39h非压缩BCD码的0~9是:00h~09h方法一:andal,0fh;实现ASCII到非压缩BCD码的转换oral,30h;实现非压缩BCD码到ASCII的转换方法二:xoral,30h;求反D5D4位,其他不变;即高4位为3,则变为0;高4位为0,则变为3movcl,4again:shrdx,1;实现逻辑右移;采用“sardx,1”,则实现算术右移rcrax,1deccl课后答案网(1)用sar编写2.20;8086的条件转移的转移范围:在当前指令地址的+127-----128之内。如条件转移的转移范围超出此范围,可在此范围内安排一条无条件转移,再转移到范围外的目标地址。2.21;(1)JMPBx;转移的有效地址EA=BX=1256h(2)JMPtABLE[Bx];转移的有效地址EA=[ds:20a1h+1256h]=[232f7]=3280h(3)JMP[Bx][si];转移的有效地址EA=[ds:1256h+528fh]=264e5h=2450h2.22;(1)xorax,1e1ehjeequal;AX=1e1eh(异或后为0)(2)testal,10000001bjnzthere;AL的D0或D7至少有一位为1(3)cmpcx,64hjbthere;CX(无符号数)<64h2.23;movcx,0不循环,因为一进入循环就判cx=0?如cx=0就退出循环delay:loopdelay2.24;(1)若DXDI,转到above执行cmpdx,dijaabove;=jnbeabove(2)若AXSI,转到greater执行cmpax,sijggreater;=jnlegreater(3)若CX=0,转到zero执行cmpcx,0jcxzzerojzzero(4)若AX-SI产生溢出,转到overflow执行;cmpax,dijooverflow(5)若SI≤AX,转到less_eq执行;cmpsi,axcmpax,sijleless_eqjgeless_eq(6)若DI≤DX,转到below_eq执行。cmpdi,dxcmpdx,di课后答案网答:将首地址为array得20个字的数组求和,并将结果存入total单元中。2.26;(1)movsi,0movdl,string[si];第1个字符送dl寄存器movsi,5movdh,string[si];第6个字符送dh寄存器(2)xorsi,si;si清零moval,buffer[si];第一字节incsimovah,buffer[si];第二字节movcl,4shlah,cl;BCD码移到高半字节oral,ah;组合成压缩BCD码movdl,al;存入dl寄..incsimoval,buffer[si];第三字节incsimovah,buffer[si];第四字节movcl,4shlah,cl;BCD码移到高半字节oral,ah;组合成压缩BCD码movdh,al;存入dh寄..(3)testdx,0f000hjzzeromovax,-1jmpdonezero:movax,0done:ret(4)leabx,buffer1leadx,buffer2movcx,8;8个字节xorsi,si;si=0clc;CF=0(5)movax,0b800hmovds,ax;段地址xorsi,si;地址偏移量si=0xordx,dx;和的高字dx=0movcx,99;加的次数课后答案网[si];第一个数again:incsi;指向下一个字单元incsiaddax,[si];加下一个数jncnoc;无进位转incdx;有进位dx=dx+1noc:deccx;次数-1jnzcx,again;非0继续加ret(6)movsi,offsetstringmovcx,8000h;32k=2^15=8000hagain:cmp[si],’$’jnznextmov[si],20h;if[si]=’$’[si]--’’next:incsiloopagain(7)xorsi,si;si--0movcx,100;循环次数again:decarray[si]deccxjnzagain(8)xorsi,si;si--0coun:cmpstring[si],’$’jedoneincsijmpcoundone:ret2..27;(1)使CF=0:clc;andax,ax;orax,ax(2)使AX=0:xorax,ax;andax,0;movax,0(3)同时使AX=0和CF=0:andax,0;xorax,ax;subax,ax2.29;压缩BCD码加法:AX←AX+BX出口参数:AX=BCD码和2.24;okmsgdb‘OK’,‘$’errmsgdb‘Error!Overflow!’,‘$’…movax,Xsubax,Yjooverflowmovdx,offsetokmsgjmpnextoverflow:movdx,errmsgnext:movah,9课后答案网错误:movax,Xsubax,Yjooverflowmovdx,offsetokmsgokmsgdb‘OK’,‘$’movdx,errmsg;错误1:数据定义在代码中movah,9int21hoverflow:errmsgdb‘Error!Overflow!’,‘$’movdx,errmsg;错误2:缺少JMP指令movah,9int21h2.37;;xt237.asm.modelsmall.stack.dataarraydb255db0array1db255dup('$')array2db0dh,0ah,'$'.code.startupmovah,0ah;键盘输入字符串movdx,offsetarrayint21hmovdx,offsetarray2;回车换行movah,09hint21hmovbx,offsetarray1again:moval,[bx]cmpal,'$'jzdonecmpal,'a';小于a和大于z的字符不是小写字母jbnextcmpal,'z'janextsubal,20h;在a和z之间的字符才是小写字母,转换为大写mov[bx],al;保存到原位置next:incbxjmpagaindone:movdx,offsetarray1movah,09h课后答案网第三章(01)3.1;硬指令:每个硬指令就是一个处理器指令,在CPU执行时产生相应功能;伪指令:伪指令并不产生处理器指令,它通常用于辅助汇编程序对源程序进行汇编。3.2;3.5;⒈编辑文本编辑程序汇编语言源程序.asm⒉汇编汇编程序目标模块文件.obj⒊连接连接程序可执行文件.exe或.com⒋调试调试程序应用程序3.6;;xt236.asm简化段定义格式.modelsmall;定义程序的存储模式(小模式).stack;定义堆栈段(默认1024个字节).data;定义数据段str1ab’InputNumber:0~9:’,0dh,0ah,’$’str2ab’Error!’,0dh,0ah,’$’.cade;定义代码段.startup;说明程序的起始点,建立ds,ss的内容。movah,09h;显示str1字符串movdx,offsetstr1int21hgtekey:movah,1;调用BIOS判断按键