您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 汇编程序设计-钱晓捷(第四版)第2章课后答案
-1-第2章8086的指令系统〔习题2.1〕已知DS=2000H、BX=0100H、SI=0002H,存储单元[20100H]~[20103H]依次存放12345678H,[21200H]~[21203H]依次存放2A4CB765H,说明下列每条指令执行完后AX寄存器的内容。(1)movax,1200h(2)movax,bx(3)movax,[1200h](4)movax,[bx](5)movax,[bx+1100h](6)movax,[bx+si](7)movax,[bx][si+1100h]〔解答〕(1)AX=1200H(2)AX=0100H(3)AX=4C2AH;偏移地址=bx=0100h(4)AX=3412H;偏移地址=bx=0100h(5)AX=4C2AH;偏移地址=bx+1100h=1200h(6)AX=7856H;偏移地址=bx+si=0100h+0002h=0102h(7)AX=65B7H;偏移地址=bx+si+1100h=0100h+0002h+1100h=1202h〔习题2.2〕指出下列指令的错误(1)movcx,dl(2)movip,ax(3)moves,1234h(4)moves,ds(5)moval,300(6)mov[sp],ax(7)movax,bx+di(8)mov20h,ah〔解答〕-2-(1)两操作数类型不匹配(2)IP指令指针禁止用户访问(3)立即数不允许传给段寄存器(4)段寄存器之间不允许传送(5)两操作数类型不匹配(6)目的操作数应为[SI](7)源操作数应为[BX+DI](8)立即数不能作目的操作数〔习题2.3〕已知数字0~9对应的格雷码依次为:18H、34H、05H、06H、09H、0AH、0CH、11H、12H、14H,它存在于以table为首地址(设为200H)的连续区域中。请为如下程序段的每条指令加上注释,说明每条指令的功能和执行结果。leabx,tablemoval,8xlat〔解答〕leabx,table;获取table的首地址,BX=200Hmoval,8;传送欲转换的数字,AL=8xlat;转换为格雷码,AL=12HP35〔习题2.4〕什么是堆栈,它的工作原则是什么,它的基本操作有哪两个,对应哪两种指令?〔解答〕堆栈是一种按“先进后出”原则存取数据的存储区域,位于堆栈段中,使用SS段寄存器记录其段地址;它的工作原则是先进后出;堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH和POP。〔习题2.5〕已知SS=2200H、SP=00B0H,画图说明执行下面指令序列时,堆栈区和SP的内容如何变化?movax,8057hpushaxmovax,0f79hpushaxpopbxpop[bx]-3-〔解答〕movax,8057hpushaxmovax,0f79hpushaxpopbx;bx=0f79hpop[bx];DS:[0f79h]=8057h〔习题2.6〕给出下列各条指令执行后AL值,以及CF、ZF、SF、OF和PF的状态:moval,89haddal,aladdal,9dhcmpal,0bchsubal,aldecalincal〔解答〕moval,89h;AL=89hCFZFSFOFPF-4-addal,al;AL=12h10011;10001001+10001001100010010addal,9dh;AL=0afh00101;00010010+1001110110101111cmpal,0bch;AL=0afh10101;10101111-10111100*01000011subal,al;AL=00h01001decal;AL=0ffh00101;00000000-00000001*11111111incal;AL=00h01001;11111111+00000001*11111111〔习题2.7〕〔解答〕W=X+Y+24-Z-5-〔习题2.8〕〔解答〕(1)ADDDX,BX(2)ADDAL,[BX+SI](3)ADD[BX+0B2H],CX(4)ADDWORDPTR[0520H],3412H(5)ADDAL,0A0H〔习题2.9〕〔解答〕[V-(X*Y+Z-540)]/XAX存商,DX存余数〔习题2.10〕〔解答〕(1)xchg的操作数不能是立即数(2)不应对CS直接赋值(3)两个操作数不能都是存储单元(4)堆栈的操作数不能是字节量(5)adc的操作数不能是段寄存器(6)没有确定是字节还是字操作(7)in不支持超过FFH的直接寻址(8)out只能以AL/AX为源操作数〔习题2.11〕movax,1470h;AX=1470HCFZFSFOFPFandax,ax;AX=1470H00000;0001010001110000-6-orax,ax;AX=1470H00000xorax,ax;AX=0000H01001notax;AX=FFFFH01001testax,0f0f0h;AX=FFFFH00101注意:MOV和NOT指令不影响标志位;其他逻辑指令使CF=OF=0,根据结果影响其他标志位。〔习题2.12〕假设例题2.34的程序段中,AX=08H,BX=10H,请说明每条指令执行后的结果和各个标志位的状态。〔解答〕指令;执行结果CFOFSFZFPFmovsi,ax;SI=AX=0008H-----shlsi,1;SI=2*AX=0010H00000addsi,ax;SI=3*AX=0018H00001movdx,bx;DX=BX=0010H00001movcl,03h;CL=03H00001shldx,cl;DX=8*BX=0080H0u000subdx,bx;DX=7*BX=0070H00000adddx,si;DX=7*BX+3*AX=0088H00001注意:逻辑左移N次相当于无符号整数乘以2的N次方,逻辑右移N次相当于无符号整数除以2的N次方。移位指令根据移位的数据设置CF,根据移位后的结果影响SF,ZF,PF。在进行一位移位时,根据最高符号位是否改变设置OF,如改变则OF=1。另外,程序注释用“u”表示标志无定义(不确定),“-”表示无影响。〔习题2.13〕编写程序段完成如下要求:(1)用位操作指令实现AL(无符号数)乘以10(2)用逻辑运算指令实现数字0~9的ASCII码与非压缩BCD码的互相转换(3)把DX.AX中的双字右移4位〔解答〕(1);不考虑进位movbl,almovcl,3shlal,cl;*8addal,bl;shlbl,1-7-addal,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,则变为3(3)movcl,4again:shrdx,1;实现逻辑右移;采用“sardx,1”,则实现算术右移rcrax,1deccljnzagain〔习题2.14〕已知AL=F7H(表示有符号数-9),分别编写用SAR和IDIV指令实现的除以2的程序段,并说明各自执行后,所得的商是什么?〔解答〕(1)用sar编写moval,0f7h;-9送AL11111001saral,1;结果:AL=11111100B=0FBH即-5(2)用idiv编写moval,0f7h;-9送al-8-cbw;字节符号扩展位字movbl,2;注意除数不可为立即数idivbl;结果:商为al=fch(-4);余数:ah=ffh(-1)结论:符号数的除法用idiv准确。〔习题2.15〕指令指针IP是通用寄存器还是专用寄存器?有指令能够直接它赋值吗?哪类指令的执行会改变它的值?〔解答〕指令指针IP不是通用寄存器,不可直接赋值,属于专用寄存器。有且仅有循环、转移、子程序调用和返回、中断类等指令可以改变它的值。〔习题2.16〕控制转移类指令中有哪三种寻址方式?〔解答〕控制转移类指令的寻址方式:相对寻址、直接寻址方式和间接寻址方式(又可以分成寄存器和存储器间接寻址)。〔习题2.17〕什么是短转移shortjump、近转移nearjump和远转移farjump?什么是段内转移和段间转移?8086有哪些指令可以实现段间转移?〔解答〕短转移:指段内-128~127之间的转移,位移量用一个字节表示近转移:指段内±32K之间的转移,位移量用一个字表示远转移:指段间1MB范围的转移段内转移:指在同一个代码段内的转移,可以是短转移或者近转移段间转移:指转移到另外一个代码段,就是远转移8086/8088CPU的JMP、CALL和INTn指令可以实现段间转移〔习题2.18〕8086的条件转移指令的转移范围有多大?实际编程时,你如何处理超出范围的条件转移?〔解答〕8086的条件转移的转移范围:在当前指令地址的+127~-128之内。如条件转移的转移范围超出此范围,可在此范围内安排一条无条件转移,再转移到范围外的目标地址。〔习题2.19〕假设DS=2000H,BX=1256H,SI=528FH,位移量TABLE=20A1H,[232F7H]=3280H,[264E5H]=2450H,试问执行下列段内间接寻址的转移指令后,转移的有效地址是什么?-9-(1)JMPBX(2)JMPTABLE[BX](3)JMP[BX][SI]〔解答〕(1)转移的有效地址EA=BX=1256H(2)转移的有效地址EA=[DS:20A1H+1256H]=[232F7]=3280H(3)转移的有效地址EA=[DS:1256H+528FH]=264E5H=2450H〔习题2.20〕判断下列程序段跳转的条件(1)xorax,1e1ehjeequal(2)testal,10000001bjnzthere(3)cmpcx,64hjbthere〔解答〕(1)AX=1e1eh(异或后为0)(2)AL的D0或D7至少有一位为1(3)CX(无符号数)<64h〔习题2.21〕设置CX=0,则LOOP指令将循环多少次?例如:movcx,0delay:loopdelay〔解答〕216次。〔习题2.22〕假设AX和SI存放的是有符号数,DX和DI存放的是无符号数,请用比较指令和条件转移指令实现以下判断:(1)若DXDI,转到above执行;(2)若AXSI,转到greater执行;(3)若CX=0,转到zero执行;(4)若AX-SI产生溢出,转到overflow执行;-10-(5)若SI≤AX,转到less_eq执行;(6)若DI≤DX,转到below_eq执行。〔解答〕(1)若DXDI,转到above执行cmpdx,dijaabove;=jnbeabove(2)若AXSI,转到greater执行cmpax,sijggreater;=jnlegreater(3)若CX=0,转到zero执行cmpcx,0jzzero;=jcxzzero(4)若AX-SI产生溢出,转到overflow执行;cmpax,sijooverflow(5)若SI≤AX,转到less_eq执行;cmpsi,ax;cmpax,sijleless_eq;jgeless_eq(6)若DI≤DX,转到below_eq执行。cmpdi,dx;cmpdx,dijbebelow_eq;jaebelow_eq〔习题2.23〕有一个首地址为array的20个字的数组,说明下列程序段的功能。movcx,20movax,0movsi,axsum_loop:addax,array[si]addsi,2loopsum_loopmovtotal,ax〔解答〕-11-将首地址为array得20个字的数组求和,并将结果存入total单元中。〔习题2.24〕按照下列要求,编写相应的程序段:(1)起始地址为string的主存单元中存放
本文标题:汇编程序设计-钱晓捷(第四版)第2章课后答案
链接地址:https://www.777doc.com/doc-4320193 .html