《汇编语言程序设计(第四版)第2章【课后答案】.pdf》由会员分享,可在线阅读,更多相关《汇编语言程序设计(第四版)第2章【课后答案】.pdf(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!-1-汇编语言程序设计 第四版 【课后习题答案】-囮裑為檤 第 2 章 8086 的指令系统 习题 2.1已知 DS2000H、BX0100H、SI0002H,存储单元20100H20103H依次存放 12 34 56 78H,21200H21203H依次存放 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+s
2、i(7)mov ax,bxsi+1100h 解答(1)AX1200H(2)AX0100H(3)AX4C2AH ;偏移地址=bx=0100h(4)AX3412H ;偏移地址=bx=0100h(5)AX4C2AH ;偏移地址=bx+1100h=1200h(6)AX7856H ;偏移地址=bx+si=0100h+0002h=0102h(7)AX65B7H ;偏移地址=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)
3、mov sp,ax(7)mov ax,bx+di 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!-2-(8)mov 20h,ah 解答(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)的连续区域
4、中。请为如下程序段的每条指令加上注释,说明每条指令的功能和执行结果。lea bx,table mov al,8 xlat 解答 lea bx,table ;获取 table 的首地址,BX200H mov al,8 ;传送欲转换的数字,AL8 xlat ;转换为格雷码,AL12H P35 习题 2.4什么是堆栈,它的工作原则是什么,它的基本操作有哪两个,对应哪两种指令?解答 堆栈是一种按“先进后出”原则存取数据的存储区域,位于堆栈段中,使用 SS 段寄存器记录其段地址;它的工作原则是先进后出;堆栈的两种基本操作是压栈和出栈,对应的指令是 PUSH 和 POP。习题 2.5已知 SS=2200H
5、、SP=00B0H,画图说明执行下面指令序列时,堆栈区和 SP 的内容如何变化?mov ax,8057h push ax mov ax,0f79h push ax 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!-3-pop bx pop 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 a
6、dd 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 add 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 11
7、00*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+2;Z、Z+2 的存储单元中,它们的运算结果存入 W 单元。阅读如下程序段,给出运算公式。mov ax,X mov
8、 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 的寄存器相对寻址方式把存储器中的一个字和 CX 寄存器的内容相加,并把结果送回存储器中。(4)用位移量为 0520H 的
9、直接寻址方式把存储器中的一个字与数 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,X
10、 ;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
11、位-(Z 的低 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 解答
12、(1)xchg 的操作数不能是立即数(2)不应对 CS 直接赋值(3)两个操作数不能都是存储单元(4)堆栈的操作数不能是字节量(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,a
13、x ;AX1470H 0 0 0 0 0 ;0001 0100 0111 0000 or ax,ax ;AX1470H 0 0 0 0 0 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!-8-xor ax,ax ;AX0000H 0 1 0 0 1 not ax ;AXFFFFH 0 1 0 0 1 test ax,0f0f0h ;AXFFFFH 0 0 1 0 1 注意:MOV 和 NOT 指令不影响标志位;其他逻辑指令使 CFOF0,根据结果影响其他标志位。习题 2.12假设例题 2.34 的程序段中,AX=08H,BX=10H,请说明每条指
14、令执行后的结果和各个标志位的状态。解答 指令 ;执行结果 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 ;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
15、 0 0 0 1 注意:逻辑左移 N 次相当于无符号整数乘以 2 的 N 次方,逻辑右移 N 次相当于无符号整数除以 2的 N 次方。移位指令根据移位的数据设置 CF,根据移位后的结果影响 SF,ZF,PF。在进行一位移位时,根据最高符号位是否改变设置 OF,如改变则 OF1。另外,程序注释用“u”表示标志无定义(不确定),“-”表示无影响。习题 2.13编写程序段完成如下要求:(1)用位操作指令实现 AL(无符号数)乘以 10(2)用逻辑运算指令实现数字 0 9 的 ASCII 码与非压缩 BCD 码的互相转换(3)把 DX.AX 中的双字右移 4 位 解答(1);不考虑进位 mov bl,
16、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,bx(2)数字 09 的 ASCII 码是:30h39h 非压缩 BCD 码的 09 是:00h09h 方法一:and al,0fh ;实现 ASCII 到非压缩 BCD 码的转换 or al,30h ;实现非压缩 BCD 码到 ASCII 的
17、转换 方法二: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),分别编写用 SAR 和 IDIV 指令实现的除以 2 的程序段,并说明各自执行后,所得的商是什么?解答(1)用 sar 编写 mov al,0f7h ;-9 送 AL 1111 1001 sar al,1 ;结果:AL=1111 1100B=0FBH
18、 即-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 是通用寄存器还是专用寄存器?有指令能够直接它赋值吗?哪类指令的执行会改变它的值?解答 指令指针 IP 不是通用寄存器,不可直接赋值,属于专用寄存器。有且仅有循环、转移、子程序调用和返回、中断类等指令可以改
19、变它的值。习题 2.16控制转移类指令中有哪三种寻址方式?解答 控制转移类指令的寻址方式:相对寻址、直接寻址方式和间接寻址方式(又可以分成寄存器和存储器间接寻址)。习题 2.17什么是短转移 short jump、近转移 near jump 和远转移 far jump?什么是段内转移和段间转移?8086 有哪些指令可以实现段间转移?解答 短转移:指段内128127 之间的转移,位移量用一个字节表示 近转移:指段内32K 之间的转移,位移量用一个字表示 远转移:指段间 1MB 范围的转移 段内转移:指在同一个代码段内的转移,可以是短转移或者近转移 段间转移:指转移到另外一个代码段,就是远转移 8
20、086/8088CPU 的 JMP、CALL 和 INT n 指令可以实现段间转移 习题 2.188086 的条件转移指令的转移范围有多大?实际编程时,你如何处理超出范围的条件转移?解答 8086 的条件转移的转移范围:在当前指令地址的+127-128 之内。如条件转移的转移范围超出此范围,可在此范围内安排一条无条件转移,再转移到范围外的目标地址。习题 2.19假设 DS=2000H,BX=1256H,SI=528FH,位移量 TABLE=20A1H,232F7H=3280H,264E5H=2450H,试问执行下列段内间接寻址的转移指令后,转移的有效地址是什么?(1)JMP BX 欢迎您阅读并
21、下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!-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)AX1e1eh(异或后为 0)(2)A
22、L 的 D0 或 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)若 AXSI 产生溢出,转到 overflow 执行;(5)若 SIAX,转到 less_eq 执行;欢迎您阅读并下载本
23、文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!-12-(6)若 DIDX,转到 below_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)若 AXSI 产生溢出,转到 overflow 执行;cmp ax,si jo overflow(5)若 SIAX,转到 less_e
24、q 执行;cmp si,ax ;cmp ax,si jle less_eq ;jge less_eq(6)若 DIDX,转到 below_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 单元中。
25、欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!-13-习题 2.24按照下列要求,编写相应的程序段:(1)起始地址为 string 的主存单元中存放有一个字符串(长度大于 6),把该字符串中的第 1 个和第 6 个字符(字节量)传送给 DX 寄存器。(2)从主存 buffer 开始的 4 个字节中保存了 4 个非压缩 BCD 码,现按低(高)地址对低(高)位的原则,将它们合并到 DX 中。(3)编写一个程序段,在 DX 高 4 位全为 0 时,使 AX=0;否则使 AX=-1。(4)有两个 64 位数值,按“小端方式”存放在两个缓冲区 buffe
26、r1 和 buffer2 中,编写程序段完成buffer1buffer2 功能。(5)假设从 B800h:0 开始存放有 100 个 16 位无符号数,编程求它们的和,并把 32 位的和保存在 DX.AX 中。(6)已知字符串 string 包含有 32KB 内容,将其中的$符号替换成空格。(7)有一个 100 个字节元素的数组,其首地址为 array,将每个元素减 1(不考虑溢出)存于原处。(8)统计以$结尾的字符串 srting 的字符个数。解答(1)解答:mov si,0 mov dl,stringsi ;第 1 个字符送 dl 寄存器:mov dl,stirng0 mov si,5 m
27、ov 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,cl ;BCD 码移到高半字节 or al,ah ;组合成压缩 BCD 码 mov dl,al ;存入 dl 寄.inc si mov al,buffersi ;第三字节 inc si 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!-14-mov ah,buffersi ;第四字
28、节 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:.(4)解答:mov ax,word ptr buffer1 sub ax,word ptr buffer2 ;先减低 16 位 mov dx,word ptr buffer1+2 sbb dx,word ptr
29、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 ;无进位转 inc dx ;有进位 dx=dx+1 noc:dec cx ;次数-1 欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭诚为您提供优质的文档!-15-jnz cx,aga
30、in ;非 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 cx,8000h cld again:scasb jnz next mov byte ptr es:di-1,n
31、ext: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 again:lo
32、dsb 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
33、 xor ax,ax sub ax,ax 习题 2.26参照本习题的示意图,分析调用序列,画出每次调用及返回时的堆栈状态。其中 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
34、 再压入断点,弹栈时先弹出断点再修改 sp。习题 2.27已知 AX、BX 存放的是 4 位压缩 BCD 表示的十进制数,请说明如下子程序的功能和出口参数。add al,bl daa xchg al,ah adc al,bh daa xchg al,ah ret 解答 压缩 BCD 码加法:AXAXBX 出口参数:AXBCD 码和 习题 2.28AAD 指令是用于除法指令之前,进行非压缩 BCD 码调整的。实际上,处理器的调整过程是:ALAH10AL,AH0。如果指令系统没有 AAD 指令,请用一个子程序完成这个调整工作。欢迎您阅读并下载本文档,本文档来源于互联网,如有侵权请联系删除!我们将竭
35、诚为您提供优质的文档!-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,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)内部中断是由于
36、8086CPU 内部执行程序引起的程序中断;外部中断是来自 8086CPU 之外的原因引起的程序中断;(2)单步中断是若单步标志 TF 为 1,则在每条指令执行结束后产生的中断;断点中断是供调试程序使用的,它的中断类型号为 3 通常调试程序时,把程序按程序的任务分成几段,然后,每段设一个段点;(3)除法错中断是在执行除法指令时,若除数为 0 或商超过了寄存器所能表达的范围产生的中断;溢出中断是在执行溢出中断指令 INTO 时,若溢出标志 OF 为 1 时产生的中断;(4)中断向量号是 中断类型号;中断向量表是中断向量号与它所对应的中断服务程序起始地址的转换表。习题 2.30试比较 INT n 和段间 CALL 指令、IRET 和段间 RET 指令的功能。解答 INT n 响应中断时,除象 CALL 保护断点外,还应保护 FR;段间 CALL 指令用在主程序中实现子程序的调用。IRET 返回时,除象 RET 恢复断点外,还应恢复 FR;子程序执行完成后,应返回主程序中继续执行,这一功能由 RET 指令完成。