新版汇编语言程序设计【课后习题答案】 钱晓捷 主编 电子工业出版社hbgj.docx
新版汇编编语言程程序设计计【课后后习题答答案】 钱晓捷捷 主编编 电子子工业出出版社 第2章章 80086的的指令系系统(全全)第2章 80886的指指令系统统习题22.1已知DDS220000H、BBX001000H、SSI000022H,存存储单元元2001000H2001033H依依次存放放12 34 56 78HH,2212000H2212003H依次存存放2AA 4CC B77 655H,说说明下列列每条指指令执行行完后AAX寄存存器的内内容。(1) movv axx,12200hh(2) movv axx,bxx(3) movv axx,112000h(4) movv axx,bbx(5) movv axx,bbx+111000h(6) movv axx,bbx+ssi(7) movv axx,bbxsi+11000h解答(1)AAX112000H(2)AAX001000H(3)AAX44C2AAH ;偏偏移地址址=bxx=01100hh(4)AAX334122H ;偏移地地址=bbx=001000h(5)AAX44C2AAH ;偏偏移地址址=bxx+11100hh=12200hh(6)AAX778566H ;偏移地地址=bbx+ssi=001000h+000022h=001022h(7)AAX665B77H ;偏移地地址=bbx+ssi+111000h=001000h+000022h+111000h=112022h 习题题2.22指出出下列指指令的错错误(1) movv cxx,dll(2) movv ipp,axx(3) movv ess,12234hh(4) movv ess,dss(5) movv all,3000(6) movv ssp,ax(7) movv axx,bxx+dii(8) movv 200h,aah解答(1)两两操作数数类型不不匹配(2)IIP指令令指针禁禁止用户户访问(3)立立即数不不允许传传给段寄寄存器(4)段段寄存器器之间不不允许传传送(5)两两操作数数类型不不匹配(6)目目的操作作数应为为 SSI (7)源源操作数数应为 BXX+DII (8)立立即数不不能作目目的操作作数习题22.3已知数数字0 99对应的的格雷码码依次为为:188H、334H、005H、006H、009H、00AH、00CH、111H、112H、114H,它它存在于于以taablee为首地地址(设设为2000H)的的连续区区域中。请请为如下下程序段段的每条条指令加加上注释释,说明明每条指指令的功功能和执执行结果果。 leea bbx,ttablle moov aal,88 xllat解答 leea bbx,ttablle ;获取ttablle的首首地址,BBX2200HH moov aal,88 ;传送送欲转换换的数字字,ALL8 xllat ;转转换为格格雷码,AAL112H P335习题22.4什么是是堆栈,它它的工作作原则是是什么,它它的基本本操作有有哪两个个,对应应哪两种种指令? 解答堆栈是一一种按“先先进后出出”原则则存取数数据的存存储区域域,位于于堆栈段段中,使使用SSS段寄存存器记录录其段地地址;它它的工作作原则是是先进后后出;堆堆栈的两两种基本本操作是是压栈和和出栈,对对应的指指令是PPUSHH和POOP。习题22.5已知SSS = 22200HH、SPP = 00BB0H,画画图说明明执行下下面指令令序列时时,堆栈栈区和SSP的内内容如何何变化? moov aax,880577h puush ax moov aax,00f799h puush ax poop bbx poop bx解答 moov aax,880577h puush ax moov aax,00f799h puush ax poop bbx ;bx=0f779h poop bx ;DS:0ff79hh=880577h 习题题2.66给出出下列各各条指令令执行后后AL值值,以及及CF、ZZF、SSF、OOF和PPF的状状态: moov aal,889h addd aal,aal addd aal,99dh cmmp aal,00bchh suub aal,aal deec aal innc aal解答mov al,89hh ; ALL=899h CFF ZZF SF OFF PPFadd al,al ; ALL=122h 1 00 0 1 11; 10000 10001+10000 110011 100001 000100 add al,9dhh ; ALL=0aafh 0 00 1 0 11; 00001 00110+ 10001 11001 10010 11111 cmp al,0bcch ; ALL=0aafh 1 00 1 0 11; 10010 11111-10111 111000* 01100 00111 sub al,al ALL=000h 0 11 0 0 11 dec al ; AAL=00ffhh 00 0 1 00 1; 00000 00000- 00000 00001 *11111 11111 inc al ; AL=00hh 0 1 00 0 1;11111 111111+00000 000011*11111 111111 习题题2.77设XX、Y、ZZ均为双双字数据据,分别别存放在在地址为为X、XX+2;Y、YY+2;Z、ZZ+2的的存储单单元中,它它们的运运算结果果存入WW单元。阅阅读如下下程序段段,给出出运算公公式。 moov aax,XX moov ddx,XX+2 addd aax,YY addc ddx,YY+2 addd aax,224 addc ddx,00 suub aax,ZZ sbbb ddx,ZZ+2 moov WW,axx moov WW+2,dx 解答 WX+YY+244-Z习题22.8请分别别用一条条汇编语语言指令令完成如如下功能能: (1)把把BX寄寄存器和和DX寄寄存器的的内容相相加,结结果存入入DX寄寄存器。(2)用用寄存器器BX和和SI的的基址变变址寻址址方式把把存储器器的一个个字节与与AL寄寄存器的的内容相相加,并并把结果果送到AAL中。(3)用用BX和和位移量量0B22H的寄寄存器相相对寻址址方式把把存储器器中的一一个字和和CX寄寄存器的的内容相相加,并并把结果果送回存存储器中中。(4)用用位移量量为05520HH的直接接寻址方方式把存存储器中中的一个个字与数数34112H相相加,并并把结果果送回该该存储单单元中。(5)把把数0AA0H与与AL寄寄存器的的内容相相加,并并把结果果送回AAL中。解答(1)AADD DX,BX(2)AADD AL,BXX+SII(3)AADD BXX+0BB2H,CXX(4)AADD WORRD PPTR 05520HH,334122H(5)AADD AL,0A00H习题22.9设X、YY、Z、VV均为116位带带符号数数,分别别装在XX、Y、ZZ、V存存储单元元中,阅阅读如下下程序段段,得出出它的运运算公式式,并说说明运算算结果存存于何处处。 moov aax,XX ;ax=X immul Y ;DX.AX=X*YY moov ccx,aax ;cx=X*YY的低116位 moox bbx,ddx ;bx=X*YY的高116位 moov aax,ZZ axx=Z cwwd addd ccx,aax ;cx=Z的低低16位位+X*Y的低低16位位 addc bbx,ddx bx=Z的高高16位位+X*Y的高高16位位+低位位进位 suub ccx,5540 ;cx=Z的低低16位位+X*Y的低低16位位-5440 sbbb bbx,00 bbx=ZZ的高116位+X*YY的高116位+低位进进位-低低位借位位 moov aax,VV ;axx=V cwwd suub aax,ccx axx=V的的低166位-(ZZ的低116位+X*YY的低116位-5400) sbbb dxx,bxx dx=V的高高16位位-(ZZ的高116位+X*YY的高116位+低位进进位-低低位借位位)-低低位借位位 idiiv XX ;/X解答 V-(X*Y+ZZ-5440)/X AX存存商,DDX存余余数 习题22.100指出出下列指指令的错错误: (1) xchhg si,300h(2) popp css(3) subb ssi,dii(4) pussh aah(5) adcc axx,dss(6) addd ssi,80hh(7) in al,3fcch(8) outt dxx,ahh解答(1)xxchgg的操作作数不能能是立即即数(2)不不应对CCS直接接赋值(3)两两个操作作数不能能都是存存储单元元(4)堆堆栈的操操作数不不能是字字节量(5)aadc的的操作数数不能是是段寄存存器(6)没没有确定定是字节节还是字字操作(7)iin不支支持超过过FFHH的直接接寻址(8)oout只只能以AAL/AAX为源源操作数数习题22.111给出出下列各各条指令令执行后后的结果果,以及及状态标标志CFF、OFF、SFF、ZFF、PFF的状态态。 moov aax,114700h annd aax,aax orr axx,axx xoor aax,aax noot aax teest ax,0f00f0hh解答 moov aax,114700h ;AX14770H CF ZFF SSF OF PFF annd aax,aax ;AXX14470HH 0 00 0 0 00 ;00001 001000 01111 00000 orr axx,axx ;AAX114700H 00 0 0 00 0 xoor aax,aax ;AXX00000HH 0 11 0 0 11 noot aax ;AXFFFFFH 0 1 00 0 1 teest ax,0f00f0hh ;AXXFFFFFHH 0 00 1 0 11注意:MMOV和和NOTT指令不不影响标标志位;其他逻逻辑指令令使CFFOFF0,根根据结果果影响其其他标志志位。习题22.122假设设例题22.322的程序序段中,AAX = 088H,BBX = 100H,请请说明每每条指令令执行后后的结果果和各个个标志位位的状态态。 解答 指令令 执行行结果 CCF OOF SSF ZZF PPF moov ssi,aax ; SII=AXX=00008HH - - - - - shhl ssi,11 ; SII=2*AX=00110H 0 00 0 0 00 addd ssi,aax ; SSI=33*AXX=00018HH 0 0 00 0 1 moov ddx,bbx DX=BX=00110H 0 0 00 0 1 moov ccl,003h CL=03HH 0 0 00 0 1 shhl ddx,ccl ; DXX=8*BX=00880H 0 uu 0 0 00 suub ddx,bbx ; DXX=7*BX=00770H 0 0 00 0 0 addd ddx,ssi DDX=77*BXX+3*AX=00888H 0 0 00 0 1注意:逻逻辑左移移N次相相当于无无符号整整数乘以以2的NN次方,逻逻辑右移移N次相相当于无无符号整整数除以以2的NN次方。移移位指令令根据移移位的数数据设置置CF,根根据移位位后的结结果影响响SF,ZZF,PPF。在在进行一一位移位位时,根根据最高高符号位位是否改改变设置置OF,如如改变则则OF1。另另外,程程序注释释用“uu”表示示标志无无定义(不不确定),“-”表示示无影响响。习题22.133编写写程序段段完成如如下要求求: (1)用用位操作作指令实实现ALL(无符符号数)乘乘以100(2)用用逻辑运运算指令令实现数数字0 99的ASSCIII码与非非压缩BBCD码码的互相相转换(3)把把DX.AX中中的双字字右移44位解答(1) 不考考虑进位位 movv bll,all moov ccl,33 shhl aal,ccl ;*8 addd aal,bbl ;shll bll,1 addd aal,bbl ;考考虑进位位 xoor aah,aah moov bbx,aax moov ccl,33 shhl aax,ccl addd aax,bbx ;shll bxx,1 addd aax,bbx(2)数数字09的AASCIII码是是:300h339h 非压压缩BCCD码的的099是:000h09hh方法一: annd aal,00fh ;实现AASCIII到非非压缩BBCD码码的转换换 orr all,300h ;实现非非压缩BBCD码码到ASSCIII的转换换方法二: xoor aal,330h ;求反DD5D44位,其其他不变变 ;即即高4位位为3,则则变为00;高44位为00,则变变为3(3) mmov cl,4agaiin: shhr ddx,11 ;实现逻逻辑右移移 ;采采用“ssar dx,1”,则则实现算算术右移移 rcrr axx,1 decc cll jnzz aggainn习题22.144已知知AL = FF7H(表表示有符符号数-9),分分别编写写用SAAR和IIDIVV指令实实现的除除以2的的程序段段,并说说明各自自执行后后,所得得的商是是什么? 解答(1)用用sarr编写 moov aal,00f7hh ; -99送ALL 11111 10001 saar aal,11 ; 结果果:ALL=11111 11000B=0FBBH 即-55(2)用用idiiv编写写 moov aal,00f7hh ; -99送all cbbw ; 字节节符号扩扩展位字字 moov bbl,22 ; 注意意除数不不可为立立即数 iddiv bl ; 结果果:商为为al=fchh (-4) ; 余数:ah=ffhh (-1) 结论:符符号数的的除法用用idiiv 准准确。 习题题2.115已已知数据据段5000h 6000h处处存放了了一个字字符串,说说明下列列程序段段执行后后的结果果: moov ssi,6600hh moov ddi,6601hh moov aax,dds moov ees,aax moov ccx,2256 sttd reep mmovssb解答 习题题2.116说说明下列列程序段段的功能能 clld moov aax,00feffh moov ccx,55 moov bbx,330000h moov ees,bbx moov ddi,220000h reep sstossw解答 将ess:dii (即即30000:220000h或3320000h)开始的的5个单单元的内内容置为为0feefh。习题22.177指令令指针IIP是通通用寄存存器还是是专用寄寄存器?有指令令能够直直接它赋赋值吗?哪类指指令的执执行会改改变它的的值? 解答指令指针针IP不不是通用用寄存器器,不可可直接赋赋值,属属于专用用寄存器器。有且且仅有循循环、转转移、子子程序调调用和返返回、中中断类等等指令可可以改变变它的值值。习题22.188控制制转移类类指令中中有哪三三种寻址址方式? 解答控制转移移类指令令的寻址址方式:相对寻寻址、直直接寻址址方式和和间接寻寻址方式式(又可可以分成成寄存器器和存储储器间接接寻址)。习题22.199什么么是短转转移shhortt juump、近近转移nnearr juump和和远转移移farr juump?什么是是段内转转移和段段间转移移?80086有有哪些指指令可以以实现段段间转移移? 解答短转移:指段内内12281127之之间的转转移,位位移量用用一个字字节表示示近转移:指段内内±322K之间间的转移移,位移移量用一一个字表表示远转移:指段间间1MBB范围的的转移段内转移移:指在在同一个个代码段段内的转转移,可可以是短短转移或或者近转转移段间转移移:指转转移到另另外一个个代码段段,就是是远转移移80866/80088CCPU的的JMPP、CAALL和和INTT n指指令可以以实现段段间转移移习题22.20080086的的条件转转移指令令的转移移范围有有多大?实际编编程时,你你如何处处理超出出范围的的条件转转移? 解答80866的条件件转移的的转移范范围:在在当前指指令地址址的 +1277-1128之之内。如条件转转移的转转移范围围超出此此范围,可可在此范范围内安安排一条条无条件件转移,再再转移到到范围外外的目标标地址。习题22.211假设设DS=20000H,BBX=112566H,SSI=5528FFH,位位移量TTABLLE=220A11H,2322F7HH=332800H,2644E5HH=224500H,试试问执行行下列段段内间接接寻址的的转移指指令后,转转移的有有效地址址是什么么? (1) JMPP BXX(2) JMPP TAABLEEBXX(3) JMPP BBXSI解答(1)转转移的有有效地址址EA= BXX=12256HH(2)转转移的有有效地址址EA= DDS:220A11H+112566H=2332F77=332800H(3)转转移的有有效地址址EA= DDS:112566H+5528FFH=2644E5HH=24450HH习题22.222判断断下列程程序段跳跳转的条条件 (11) xxor ax,1e11eh jee eqquall (22)teest al,1000000001bb jjnz theere (33)cmmp ccx,664h jjb ttherre解答(1)AAX11e1eeh(异异或后为为0)(2)AAL的DD0或DD7至少少有一位位为1(3)CCX(无无符号数数) 64hh习题22.233设置置CX = 00,则LLOOPP指令将将循环多多少次?例如: movv cxx,0delaay: lloopp deelayy解答 2216次次。习题22.244假设设AX和和SI存存放的是是有符号号数,DDX和DDI存放放的是无无符号数数,请用用比较指指令和条条件转移移指令实实现以下下判断: (1)若若DX > DDI,转转到abbovee执行;(2)若若AX > SSI,转转到grreatter执执行;(3)若若CX = 00,转到到zerro执行行;(4)若若AXSI产产生溢出出,转到到oveerfllow执执行;(5)若若SIAX,转转到leess_eq执执行;(6)若若DIDX,转转到beeloww_eqq执行。解答(1)若若DX > DDI,转转到abbovee执行 cmmp ddx,ddi jaa abbovee ;jnnbe aboove(2)若若AX > SSI,转转到grreatter执执行 cmmp aax,ssi jgg grreatter ;jnnle greeateer(3)若若CX = 00,转到到zerro执行行 cmmp ccx,00 jzz zeero ; jjcxzz zeero (4)若若AXSI产产生溢出出,转到到oveerfllow执执行; cmmp aax,ssi joo ovverffloww(5)若若SIAX,转转到leess_eq执执行; cmmp ssi,aax ; cmmp aax,ssi jlle llesss_eqq ; jgge llesss_eqq(6)若若DIDX,转转到beeloww_eqq执行。 cmmp ddi,ddx ; cmmp ddx,ddi jbbe bbeloow_eeq ; jaae bbeloow_eeq习题22.255有一一个首地地址为aarraay的220个字字的数组组,说明明下列程程序段的的功能。 moov ccx,220 moov aax,00 moov ssi,aaxsum_looop: addd aax,aarraayssi addd ssi,22 looop summ_looop moov ttotaal,aax解答将首地址址为arrrayy得200个字的的数组求求和,并并将结果果存入 tottal 单元中中。习题22.266按照照下列要要求,编编写相应应的程序序段: (1)起起始地址址为sttrinng的主主存单元元中存放放有一个个字符串串(长度度大于66),把把该字符符串中的的第1个个和第66个字符符(字节节量)传传送给DDX寄存存器。(2)从从主存bbufffer开开始的44个字节节中保存存了4个个非压缩缩BCDD码,现现按低(高高)地址址对低(高高)位的的原则,将将它们合合并到DDX中。(3)编编写一个个程序段段,在DDX高44位全为为0时,使使AX = 00;否则则使AXX = -1。(4)有有两个664位数数值,按按“小端端方式”存存放在两两个缓冲冲区buuffeer1和和buffferr2中,编编写程序序段完成成buffferr1bbufffer22功能。(5)假假设从BB8000h : 0开开始存放放有1000个116位无无符号数数,编程程求它们们的和,并并把322位的和和保存在在DX.AX中中。(6)已已知字符符串sttrinng包含含有322KB内内容,将将其中的的$符号替替换成空空格。(7)有有一个1100个个字节元元素的数数组,其其首地址址为arrrayy,将每每个元素素减1(不不考虑溢溢出)存存于原处处。(8)统统计以 $ 结尾尾的字符符串srrtinng的字字符个数数。解答(1)解解答: moov ssi,00 moov ddl,sstriingsi ;第11个字符符送dll寄存器器:moov ddl,sstirrng0 moov ssi,55 moov ddh,sstriingsi ;第66个字符符送dhh寄存器器:moov ddl,sstirrng5(2)解解答: xoor ssi,ssi ;sii清零 moov aal,bbufffersi ;第一一字节 innc ssi moov aah,bbufffersi ;第二二字节 moov ccl,44 shhl aah,ccl ;BCDD码移到到高半字字节 orr all,ahh ;组合成成压缩BBCD码码 moov ddl,aal ;存入ddl寄. innc ssi moov aal,bbufffersi ;第三三字节 innc ssi moov aah,bbufffersi ;第四四字节 moov ccl,44 shhl aah,ccl ;BCDD码移到到高半字字节 orr all,ahh ;组合成成压缩BBCD码码 moov ddh,aal ;存入ddh寄.(3)解解答: teest dx,0f0000hh ; teest dh,0f00h jzz neext ; jnnz nnextt moov aax,-1 ; moov aax,00 jmmp aagaiinnextt: movv axx,0 ; movv axx,0ffffffhagaiin: .(4)解解答: moov aax, worrd pptr buffferr1