汇编语言程序设计(第四版)第2章【课后答案】-.pdf

上传人:索**** 文档编号:76271191 上传时间:2023-03-08 格式:PDF 页数:18 大小:167.68KB
返回 下载 相关 举报
汇编语言程序设计(第四版)第2章【课后答案】-.pdf_第1页
第1页 / 共18页
汇编语言程序设计(第四版)第2章【课后答案】-.pdf_第2页
第2页 / 共18页
点击查看更多>>
资源描述

《汇编语言程序设计(第四版)第2章【课后答案】-.pdf》由会员分享,可在线阅读,更多相关《汇编语言程序设计(第四版)第2章【课后答案】-.pdf(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、-1-汇编语言程序设计第四版【课后习题答案】-囮裑為檤第 2 章 8086 的指令系统习题 2.1已知 DS2000H、BX 0100H、SI0002H,存储单元 20100H 20103H 依次存放 12 34 56 78H,21200H 21203H 依次存放 2A 4C B7 65H,说明下列每条指令执行完后AX 寄存器的内容。(1)mov ax,1200h(2)mov ax,bx(3)mov ax,1200h(4)mov ax,bx(5)mov ax,bx+1100h(6)mov ax,bx+si(7)mov ax,bxsi+1100h 解答(1)AX 1200H(2)AX 0100H

2、(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)mov cx,dl(2)mov ip,ax(3)mov es,1234h(4)mov es,ds(5)mov al,300(6)mov sp,ax(7)mov ax,bx+di-2-(8)mov 20h,a

3、h 解答(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)的连续区域中。请为如下程序段的每条指令加上注释,说明每条指令的功能和执行结果。lea bx,table mov al,8 xlat 解答lea bx,table ;获取 table 的首地址,

4、BX200H mov al,8 ;传送欲转换的数字,AL 8 xlat ;转换为格雷码,AL 12H P35 习题 2.4什么是堆栈,它的工作原则是什么,它的基本操作有哪两个,对应哪两种指令?解答堆栈是一种按“先进后出”原则存取数据的存储区域,位于堆栈段中,使用SS 段寄存器记录其段地址;它的工作原则是先进后出;堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH 和 POP。习题 2.5已知 SS=2200H、SP=00B0H,画图说明执行下面指令序列时,堆栈区和SP 的内容如何变化?mov ax,8057h push ax mov ax,0f79h push ax-3-pop bx pop

5、 bx 解答mov ax,8057h push ax mov ax,0f79h push ax pop bx ;bx=0f79h pop bx ;DS:0f79h=8057h 习题 2.6给出下列各条指令执行后AL 值,以及 CF、ZF、SF、OF 和 PF 的状态:mov al,89h add al,al add al,9dh cmp al,0bch sub al,al dec al inc al-4-解答mov al,89h ;AL=89h CF ZF SF OF PF add al,al ;AL=12h 1 0 0 1 1;1000 1001+1000 1001 10001 0010 a

6、dd al,9dh ;AL=0afh 0 0 1 0 1;0001 0010+1001 1101 1010 1111 cmp al,0bch ;AL=0afh 1 0 1 0 1;1010 1111-1011 1100*0100 0011 sub al,al ;AL=00h 0 1 0 0 1 dec al ;AL=0ffh 0 0 1 0 1;0000 0000-0000 0001 *1111 1111 inc al ;AL=00h 0 1 0 0 1;1111 1111+0000 0001*1111 1111-5-习题 2.7设 X、Y、Z 均为双字数据,分别存放在地址为X、X+2;Y、Y

7、+2;Z、Z+2 的存储单元中,它们的运算结果存入W 单元。阅读如下程序段,给出运算公式。mov ax,X mov dx,X+2 add ax,Y adc dx,Y+2 add ax,24 adc dx,0 sub ax,Z sbb dx,Z+2 mov W,ax mov W+2,dx 解答WX+Y+24-Z 习题 2.8请分别用一条汇编语言指令完成如下功能:(1)把 BX 寄存器和 DX 寄存器的内容相加,结果存入DX 寄存器。(2)用寄存器 BX 和 SI 的基址变址寻址方式把存储器的一个字节与AL 寄存器的内容相加,并把结果送到 AL 中。(3)用 BX 和位移量 0B2H 的寄存器相对

8、寻址方式把存储器中的一个字和CX 寄存器的内容相加,并把结果送回存储器中。(4)用位移量为0520H 的直接寻址方式把存储器中的一个字与数3412H 相加,并把结果送回该存储单元中。(5)把数 0A0H 与 AL 寄存器的内容相加,并把结果送回AL 中。解答(1)ADD DX,BX(2)ADD AL,BX+SI(3)ADD BX+0B2H,CX-6-(4)ADD WORD PTR 0520H,3412H(5)ADD AL,0A0H 习题 2.9设 X、Y、Z、V 均为 16 位带符号数,分别装在X、Y、Z、V 存储单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处。mov ax,

9、X ;ax=X imul Y ;DX.AX=X*Y mov cx,ax ;cx=X*Y的低 16 位mox bx,dx ;bx=X*Y的高 16 位mov ax,Z ;ax=Z cwd add cx,ax ;cx=Z 的低 16 位+X*Y 的低 16 位adc bx,dx ;bx=Z 的高 16 位+X*Y 的高 16 位+低位进位sub cx,540 ;cx=Z 的低 16 位+X*Y 的低 16 位-540 sbb bx,0 ;bx=Z的高 16 位+X*Y 的高 16 位+低位进位-低位借位mov ax,V ;ax=V cwd sub ax,cx ;ax=V 的低 16 位-(Z 的低

10、 16 位+X*Y 的低 16 位-540)sbb dx,bx ;dx=V的高 16 位-(Z 的高 16 位+X*Y 的高 16 位+低位进位-低位借位)-低位借位idiv X;/X 解答V-(X*Y+Z-540)/X AX 存商,DX 存余数习题 2.10指出下列指令的错误:(1)xchg si,30h-7-(2)pop cs(3)sub si,di(4)push ah(5)adc ax,ds(6)add si,80h(7)in al,3fch(8)out dx,ah 解答(1)xchg的操作数不能是立即数(2)不应对 CS 直接赋值(3)两个操作数不能都是存储单元(4)堆栈的操作数不能是

11、字节量(5)adc 的操作数不能是段寄存器(6)没有确定是字节还是字操作(7)in 不支持超过FFH 的直接寻址(8)out 只能以 AL/AX 为源操作数习题 2.11给出下列各条指令执行后的结果,以及状态标志CF、OF、SF、ZF、PF 的状态。mov ax,1470h and ax,ax or ax,ax xor ax,ax not ax test ax,0f0f0h 解答mov ax,1470h ;AX1470H CF ZF SF OF PF and ax,ax ;AX1470H 0 0 0 0 0;0001 0100 0111 0000 or ax,ax ;AX 1470H 0 0

12、0 0 0-8-xor ax,ax ;AX 0000H 0 1 0 0 1 not ax ;AX FFFFH 0 1 0 0 1 test ax,0f0f0h ;AX FFFFH 0 0 1 0 1 注意:MOV 和 NOT 指令不影响标志位;其他逻辑指令使CFOF0,根据结果影响其他标志位。习题 2.12假设例题2.34 的程序段中,AX=08H,BX=10H,请说明每条指令执行后的结果和各个标志位的状态。解答指令;执行结果 CF OF SF ZF PF mov si,ax ;SI=AX=0008H -shl si,1 ;SI=2*AX=0010H 0 0 0 0 0 add si,ax ;

13、SI=3*AX=0018H 0 0 0 0 1 mov dx,bx ;DX=BX=0010H 0 0 0 0 1 mov cl,03h ;CL=03H 0 0 0 0 1 shl dx,cl ;DX=8*BX=0080H 0 u 0 0 0 sub dx,bx ;DX=7*BX=0070H 0 0 0 0 0 add dx,si ;DX=7*BX+3*AX=0088H 0 0 0 0 1 注意:逻辑左移N 次相当于无符号整数乘以2 的 N 次方,逻辑右移N 次相当于无符号整数除以2的 N 次方。移位指令根据移位的数据设置CF,根据移位后的结果影响SF,ZF,PF。在进行一位移位时,根据最高符号

14、位是否改变设置OF,如改变则OF1。另外,程序注释用“u”表示标志无定义(不确定),“-”表示无影响。习题 2.13编写程序段完成如下要求:(1)用位操作指令实现AL(无符号数)乘以10(2)用逻辑运算指令实现数字0 9 的 ASCII 码与非压缩BCD 码的互相转换(3)把 DX.AX 中的双字右移4 位解答(1);不考虑进位mov bl,al mov cl,3 shl al,cl ;*8 add al,bl ;shl bl,1 add al,bl-9-;考虑进位xor ah,ah mov bx,ax mov cl,3 shl ax,cl add ax,bx ;shl bx,1 add ax

15、,bx(2)数字 09 的 ASCII 码是:30h 39h 非压缩 BCD 码的 09 是:00h 09h 方法一:and al,0fh ;实现 ASCII 到非压缩 BCD 码的转换or al,30h ;实现非压缩BCD 码到 ASCII 的转换方法二:xor al,30h ;求反 D5D4 位,其他不变;即高 4 位为 3,则变为 0;高 4 位为 0,则变为3(3)mov cl,4 again:shr dx,1 ;实现逻辑右移;采用“sar dx,1”,则实现算术右移 rcr ax,1 dec cl jnz again 习题 2.14已知 AL=F7H(表示有符号数-9),分别编写用S

16、AR 和 IDIV 指令实现的除以2 的程序段,并说明各自执行后,所得的商是什么?解答(1)用 sar 编写mov al,0f7h ;-9 送 AL 1111 1001 sar al,1 ;结果:AL=1111 1100B=0FBH 即-5(2)用 idiv 编写mov al,0f7h ;-9 送 al cbw ;字节符号扩展位字-10-mov bl,2 ;注意除数不可为立即数idiv bl ;结果:商为al=fch (-4);余数:ah=ffh(-1)结论:符号数的除法用idiv 准确。习题 2.15指令指针IP 是通用寄存器还是专用寄存器?有指令能够直接它赋值吗?哪类指令的执行会改变它的值

17、?解答指令指针 IP 不是通用寄存器,不可直接赋值,属于专用寄存器。有且仅有循环、转移、子程序调用和返回、中断类等指令可以改变它的值。习题 2.16控制转移类指令中有哪三种寻址方式?解答控制转移类指令的寻址方式:相对寻址、直接寻址方式和间接寻址方式(又可以分成寄存器和存储器间接寻址)。习题 2.17什么是短转移short jump、近转移 near jump和远转移 far jump?什么是段内转移和段间转移?8086 有哪些指令可以实现段间转移?解答短转移:指段内128127 之间的转移,位移量用一个字节表示近转移:指段内 32K 之间的转移,位移量用一个字表示远转移:指段间1MB 范围的转

18、移段内转移:指在同一个代码段内的转移,可以是短转移或者近转移段间转移:指转移到另外一个代码段,就是远转移8086/8088CPU的 JMP、CALL 和 INT n 指令可以实现段间转移习题 2.188086 的条件转移指令的转移范围有多大?实际编程时,你如何处理超出范围的条件转移?解答8086 的条件转移的转移范围:在当前指令地址的+127-128 之内。如条件转移的转移范围超出此范围,可在此范围内安排一条无条件转移,再转移到范围外的目标地址。习题 2.19假设 DS=2000H,BX=1256H,SI=528FH,位移量TABLE=20A1H,232F7H=3280H,264E5H=245

19、0H,试问执行下列段内间接寻址的转移指令后,转移的有效地址是什么?(1)JMP BX-11-(2)JMP TABLEBX(3)JMP BXSI 解答(1)转移的有效地址EA=BX=1256H(2)转移的有效地址EA=DS:20A1H+1256H=232F7=3280H(3)转移的有效地址EA=DS:1256H+528FH=264E5H=2450H 习题 2.20判断下列程序段跳转的条件(1)xor ax,1e1eh je equal(2)test al,10000001b jnz there(3)cmp cx,64h jb there 解答(1)AX 1e1eh(异或后为0)(2)AL 的 D

20、0 或 D7 至少有一位为1(3)CX(无符号数)64h 习题 2.21设置 CX=0,则 LOOP 指令将循环多少次?例如:mov cx,0 delay:loop delay 解答216 次。习题 2.22假设 AX 和 SI 存放的是有符号数,DX 和 DI 存放的是无符号数,请用比较指令和条件转移指令实现以下判断:(1)若 DX DI,转到 above 执行;(2)若 AX SI,转到 greater执行;(3)若 CX=0,转到 zero 执行;(4)若 AX SI 产生溢出,转到overflow执行;(5)若 SIAX,转到 less_eq执行;-12-(6)若 DIDX,转到 be

21、low_eq执行。解答(1)若 DX DI,转到 above 执行cmp dx,di ja above ;jnbe above(2)若 AX SI,转到 greater执行cmp ax,si jg greater ;jnle greater(3)若 CX=0,转到 zero 执行cmp cx,0 jz zero ;jcxz zero (4)若 AX SI 产生溢出,转到overflow执行;cmp ax,si jo overflow(5)若 SIAX,转到 less_eq执行;cmp si,ax ;cmp ax,si jle less_eq ;jge less_eq(6)若 DIDX,转到 b

22、elow_eq执行。cmp di,dx ;cmp dx,di jbe below_eq ;jae below_eq 习题 2.23有一个首地址为array 的 20 个字的数组,说明下列程序段的功能。mov cx,20 mov ax,0 mov si,ax sum_loop:add ax,arraysi add si,2 loop sum_loop mov total,ax 解答将首地址为array 得 20 个字的数组求和,并将结果存入total 单元中。-13-习题 2.24按照下列要求,编写相应的程序段:(1)起始地址为string的主存单元中存放有一个字符串(长度大于6),把该字符串中

23、的第1 个和第 6 个字符(字节量)传送给DX 寄存器。(2)从主存 buffer开始的 4 个字节中保存了4 个非压缩 BCD 码,现按低(高)地址对低(高)位的原则,将它们合并到DX 中。(3)编写一个程序段,在DX 高 4 位全为 0 时,使 AX=0;否则使AX=-1。(4)有两个64 位数值,按“小端方式”存放在两个缓冲区buffer1和 buffer2中,编写程序段完成buffer1 buffer2功能。(5)假设从 B800h:0 开始存放有100 个 16 位无符号数,编程求它们的和,并把32 位的和保存在 DX.AX 中。(6)已知字符串string包含有 32KB 内容,将

24、其中的?$?符号替换成空格。(7)有一个 100 个字节元素的数组,其首地址为array,将每个元素减1(不考虑溢出)存于原处。(8)统计以?$?结尾的字符串srting的字符个数。解答(1)解答:mov si,0 mov dl,stringsi ;第 1 个字符送 dl 寄存器:mov dl,stirng0 mov si,5 mov dh,stringsi ;第 6 个字符送 dh 寄存器:mov dl,stirng5(2)解答:xor si,si ;si 清零mov al,buffersi ;第一字节inc si mov ah,buffersi ;第二字节mov cl,4 shl ah,c

25、l ;BCD 码移到高半字节or al,ah ;组合成压缩BCD 码mov dl,al ;存入 dl 寄.inc si mov al,buffersi ;第三字节inc si-14-mov ah,buffersi ;第四字节mov cl,4 shl ah,cl ;BCD 码移到高半字节or al,ah ;组合成压缩BCD 码mov dh,al ;存入 dh 寄.(3)解答:test dx,0f000h ;test dh,0f0h jz next ;jnz next mov ax,-1 ;mov ax,0 jmp again next:mov ax,0 ;mov ax,0ffffh again:

26、.(4)解答:mov ax,word ptr buffer1 sub ax,word ptr buffer2 ;先减低 16 位mov dx,word ptr buffer1+2 sbb dx,word ptr buffer2+2 ;后减高 16 位,需减低16 位的借位(5)解答:mov ax,0b800h mov ds,ax ;段地址 xor si,si ;地址偏移量si=0 xor dx,dx ;和的高字dx=0 mov cx,99 ;加的次数 mov ax,si ;第一个数again:inc si ;指向下一个字单元 inc si add ax,si ;加下一个数 jnc noc ;无

27、进位转 inc dx ;有进位dx=dx+1 noc:dec cx ;次数-1-15-jnz cx,again ;非 0 继续加(6)解答 1:不使用串操作指令(更好)mov si,offset string mov cx,8000h ;32k=215=8000h again:cmp byte ptr si,$?;,$?24h jnz next ;不要采用jz 进行分支mov byte ptr si,?;,?20h next:inc si loop again ;dec cx;jnz again(6)解答 2:使用串操作指令mov di,offset string mov al,?$?mov

28、cx,8000h cld again:scasb jnz next mov byte ptr es:di-1,?next:loop again(7)解答 1:mov si,offset array mov cx,100 again:dec byte ptr si inc si loop again(7)解答 2:xor si,si ;si-0-16-mov cx,100 ;循环次数 again:dec arraysi inc si loop again(7)解答 3:mov si,offset array mov di,si mov ax,ds mov es,ax mov cx,100 cld

29、 again:lodsb dec al stosb loop again(8)解答:xor si,si ;si-0 coun:cmp stringsi,$je done inc si jmp coun done:.习题 2.25对下面要求,分别给出3 种方法,每种方法只用一条指令。(1)使 CF=0 (2)使 AX=0 (3)同时使AX=0 和 CF=0 解答(1)解答:clc and ax,ax or ax,ax(2)解答:-17-xor ax,ax and ax,0 mov ax,0(3)解答:and ax,0 xor ax,ax sub ax,ax 习题 2.26参照本习题的示意图,分析

30、调用序列,画出每次调用及返回时的堆栈状态。其中CALL前是该指令所在的逻辑地址;另外,段内直接调用指令的机器代码的字节数为3,段间直接调用指令则为5 个字节。解答主程序转子suba 时段内调用:断点1 为 2000h:0400h+3,转子是只将IP 压栈。suba 转子 subb 时段间调用:断点2 为 2000h:0840h+5,转子时须将cs 段地址和IP 压栈suba 转子 subc 时段内调用:断点3 为 2000h:0c021h+3,转子是只将IP 压栈。注:压栈时先修改sp 再压入断点,弹栈时先弹出断点再修改sp。习题 2.27已知 AX、BX 存放的是 4 位压缩 BCD 表示的

31、十进制数,请说明如下子程序的功能和出口参数。add al,bl daa xchg al,ah adc al,bh daa xchg al,ah ret 解答压缩 BCD 码加法:AXAX BX 出口参数:AX BCD 码和习题 2.28AAD 指令是用于除法指令之前,进行非压缩BCD 码调整的。实际上,处理器的调整过程是:ALAH 10 AL,AH 0。如果指令系统没有AAD 指令,请用一个子程序完成这个调整工作。-18-解答shl ah,1 ;ah=2*a (设原 ah=a)mov dl,ah ;dl=2*a mov cl,2 ;设定移位次数 shl ah,cl ;ah=8*a add ah

32、,dl ;ah=10*a add al,ah ;al=10*a+al xor ah,ah ;清零 ah int 3 ;返回 DOS 注意:入口:AX 中存放有“和”(两非压缩BCD 码)出口:AL 中 已为调整后的二进制数习题 2.29解释如下有关中断的概念:(1)内部中断和外部中断(2)单步中断和断点中断(3)除法错中断和溢出中断(4)中断向量号和中断向量表解答(1)内部中断是由于8086CPU 内部执行程序引起的程序中断;外部中断是来自8086CPU之外的原因引起的程序中断;(2)单步中断是若单步标志TF 为 1,则在每条指令执行结束后产生的中断;断点中断是供调试程序使用的,它的中断类型号

33、为3 通常调试程序时,把程序按程序的任务分成几段,然后,每段设一个段点;(3)除法错中断是在执行除法指令时,若除数为0 或商超过了寄存器所能表达的范围产生的中断;溢出中断是在执行溢出中断指令INTO 时,若溢出标志OF 为 1 时产生的中断;(4)中断向量号是中断类型号;中断向量表是中断向量号与它所对应的中断服务程序起始地址的转换表。习题 2.30试比较INT n 和段间 CALL 指令、IRET 和段间 RET 指令的功能。解答INT n 响应中断时,除象CALL 保护断点外,还应保护FR;段间 CALL指令用在主程序中实现子程序的调用。IRET 返回时,除象RET 恢复断点外,还应恢复FR;子程序执行完成后,应返回主程序中继续执行,这一功能由RET 指令完成。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 实施方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁