汇编语言与接口技术(第 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