logo资料库

《汇编语言与接口技术 (第3 版)》第三章【课后习题答案】.pdf

第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
资料共12页,剩余部分请下载后查看
汇编语言与接口技术(第 3 版)【课后习题答案】 第 3 章 80X86 指令系统和寻址方式 1. 已知 DS=2000H、BX=0100H、SI=0002H,存储单元[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,[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. 指出下列指令的错误 (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 (8) mov 20h,ah 〔解答〕 (1)两操作数类型不匹配 (2)IP 指令指针禁止用户访问 (3)立即数不允许传给段寄存器 (4)段寄存器之间不允许传送 (5)两操作数类型不匹配 (6)目的操作数应为[ SI ] (7)源操作数应为 [BX+DI] (8)立即数不能作目的操作数 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 的首地址,BX=200H mov al,8 ;传送欲转换的数字,AL=8 xlat ;转换为格雷码,AL=12H P35 4. 什么是堆栈,它的工作原则是什么,它的基本操作有哪两个,对应哪两种指令? 〔解答〕 堆栈是一种按“先进后出”原则存取数据的存储区域,位于堆栈段中,使用 SS 段寄存器记录其 段地址;它的工作原则是先进后出;堆栈的两种基本操作是压栈和出栈,对应的指令是 PUSH 和 POP。 5. 已知 SS = FFA0H、SP = 00B0H,画图说明执行下面指令序列时,堆栈区和 SP 的内容如何变 化? mov ax,8057h push ax mov ax,0f79h push ax pop bx pop [bx] 〔解答〕 mov ax,8057h push ax mov ax,0f79h push ax pop bx ;bx=0f79h pop [bx] ;DS:[0f79h]=8057h
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 〔解答〕 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 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 7. 设 X、Y、Z 均为双字数据,分别存放在地址为 X、X+2;Y、Y+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 〔解答〕 W=X+Y+24-Z 8. 请分别用一条汇编语言指令完成如下功能: (1)把 BX 寄存器和 DX 寄存器的内容相加,结果存入 DX 寄存器。 (2)用寄存器 BX 和 SI 的基址变址寻址方式把存储器的一个字节与 AL 寄存器的内容相加,并 把结果送到 AL 中。 (3)用 BX 和位移量 0B2H 的寄存器相对寻址方式把存储器中的一个字和 CX 寄存器的内容相加, 并把结果送回存储器中。 (4)把数 0A0H 与 AL 寄存器的内容相加,并把结果送回 AL 中。 〔解答〕 (1)ADD DX,BX (2)ADD AL,[BX+SI] (3)ADD [BX+0B2H],CX (4)ADD AL,0A0H 9. 设 X、Y、Z、V 均为 16 位带符号数,分别装在 X、Y、Z、V 存储单元中,阅读如下程序段, 得出它的运算公式,并说明运算结果存于何处。 mov ax,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 的低 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 存余数 10. 指出下列指令的错误: (1) xchg [si],30h (2) pop cs (3) sub [si],[di] (4) push ah (5) adc ax,ds (6) out dx,ah
(7) in al,3fch 〔解答〕 (1)xchg 的操作数不能是立即数 (2)不应对 CS 直接赋值 (3)两个操作数不能都是存储单元 (4)堆栈的操作数不能是字节量 (5)adc 的操作数不能是段寄存器 (6)out 只能以 AL/AX 为源操作数 (7)in 不支持超过 FFH 的直接寻址 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 ;AX=1470H CF ZF SF OF PF and ax,ax ;AX=1470H 0 0 0 0 0 ;0001 0100 0111 0000 or ax,ax ;AX=1470H 0 0 0 0 0 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 指令不影响标志位;其他逻辑指令使 CF=OF=0,根据结果影响其他标志位。 12. 编写程序段完成如下要求: (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 ;考虑进位 xor ah,ah mov bx,ax mov cl,3 shl ax,cl add ax,bx ;shl bx,1
add ax,bx (2)数字 0~9 的 ASCII 码是:30h~39h 非压缩 BCD 码的 0~9 是: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 13. 已知 AL = F7H(表示有符号数-9),分别编写用 SAR 和 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 ; 字节符号扩展位字 mov bl,2 ; 注意除数不可为立即数 idiv bl ; 结果:商为 al=fch (-4) ; 余数:ah=ffh (-1) 结论:符号数的除法用 idiv 准确。 14. 已知数据段 500h ~600h 处存放了一个字符串,说明下列程序段执行后的结果: mov si,600h mov di,601h mov ax,ds mov es,ax mov cx,256 std rep movsb 〔解答〕
15. 说明下列程序段的功能 cld mov ax,0fefh mov cx,5 mov bx,3000h mov es,bx mov di,2000h rep stosw 〔解答〕 将 es:di (即 3000:2000h 或 32000h)开始的 5 个单元的内容置为 0fefh。 16. 指令指针 IP 是通用寄存器还是专用寄存器?有指令能够直接它赋值吗?哪类指令的执行 会改变它的值? 〔解答〕 指令指针 IP 不是通用寄存器,不可直接赋值,属于专用寄存器。有且仅有循环、 转移、子程序调用和返回、中断类等指令可以改变它的值。
17. 控制转移类指令中有哪三种寻址方式? 〔解答〕 控制转移类指令的寻址方式:相对寻址、直接寻址方式和间接寻址方式(又可以分 成寄存器和存储器间接寻址)。 18. 什么是短转移 short jump、近转移 near jump 和远转移 far jump?什么是段内转移和段间 转移?8086 有哪些指令可以实现段间转移? 〔解答〕 短转移:指段内-128~127 之间的转移,位移量用一个字节表示 近转移:指段内±32K 之间的转移,位移量用一个字表示 远转移:指段间 1MB 范围的转移 段内转移:指在同一个代码段内的转移,可以是短转移或者近转移 段间转移:指转移到另外一个代码段,就是远转移 8086/8088CPU 的 JMP、CALL 和 INT n 指令可以实现段间转移 19. 8086 的条件转移指令的转移范围有多大?实际编程时,你如何处理超出范围的条件转移? 〔解答〕 8086 的条件转移的转移范围:在当前指令地址的 +127~-128 之内。 如条件转移的转移范围超出此范围,可在此范围内安排一条无条件转移,再转移到范围外的目 标地址。 20. 假设 DS=2000H,BX=1256H,SI=528FH,位移量 TABLE=20A1H,[232F7H]=3280H, [264E5H]=2450H,试问执行下列段内间接寻址的转移指令后,转移的有效地址是什么? (1) JMP BX (2) JMP TABLE[BX] (3) JMP [BX][SI] 〔解答〕 (1)转移的有效地址 EA= BX=1256H (2)转移的有效地址 EA= [DS:20A1H+1256H]=[232F7]=3280H (3)转移的有效地址 EA= [DS:1256H+528FH]=264E5H=2450H 21. 判断下列程序段跳转的条件 (1)xor ax,1e1eh je equal (2)test al,10000001b jnz there (3)cmp cx,64h jb there 〔解答〕 (1)AX=1e1eh(异或后为 0) (2)AL 的 D0 或 D7 至少有一位为 1 (3)CX(无符号数)< 64h 22. 设置 CX = 0,则 LOOP 指令将循环多少次?例如: mov cx,0 delay: loop delay
分享到:
收藏