-
汇编语言程序设计
第四版
【课后习题答案】
--
囮裑為檤
第
2
章
8086
的指令系统
〔习题
2.1
〕
已知
DS
=
2000H
、<
/p>
BX
=
0100H
、
SI
=
0002H
,存储单元
[20100H]
~
[20103H]
依次存放
12 34
56 78H
,
[21200H]
p>
~
[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
=
1
200H
(
2
)
AX
=
0100H
(
3
)
AX
=
4C2AH
;
偏移地址
=bx=0100h
p>
(
4
)
AX
=
3412H
;
偏移地址
=bx=0100h
p>
(
5
)
AX
=
4C2AH
;
偏移地址
=bx+1100h=1200h
(
6
)
AX
=
7856H
;
偏移地址
=bx+si=0100h+0002h=0102h
(
7
)
AX
=
65
B7H
;
偏移地址
=bx+s
i+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
- 1
-
(
8
)
mov 20h,ah
〔解答〕
<
/p>
(
1
)两操作数类型不匹配
(
2
)
< br>IP
指令指针禁止用户访问
(
3
)立即数不允许传给段寄存器
p>
(
4
)段寄存器之间不允许传送
(
5
)两操作数类型不
匹配
(
6
)
目的操作数应为
[ SI ]
(
7<
/p>
)源操作数应为
[BX+DI]
(
8
)立即
数不能作目的操作数
〔习题
2.3
〕
已知数字
0
~ 9
对应的格雷码依次为:
18H
、
34H
、
05H
、
06H
、
09H
< br>、
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
<
/p>
〔习题
2.4
〕什么是堆栈,它的工作原
则是什么,它的基本操作有哪两个,对应哪两种指令?
〔解答〕
堆栈是一种按
“
先进后出
”
原则存取数据
的存储区域,位于堆栈段中,使用
SS
段寄存器记录其段地
p>
址;它的工作原则是先进后出;堆栈的两种基本操作是压栈和出栈,对应的指令是
PUSH
和
POP
。
p>
〔习题
2.5
〕已知
SS =
2200H
、
SP = 00B0H
,
画图说明执行下面指令序列时,堆栈区和
SP
的内容如何
变化?
mov ax,8057h
push ax
mov ax,0f79h
push ax
- 2 -
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
值,以及
< br>CF
、
ZF
、
< br>SF
、
OF
和
< br>PF
的状态:
mov al,89h
add al,al
add al,9dh
cmp al,0bch
sub al,al
dec al
inc al
- 3 -
〔解答〕
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
; 0001 0010
+ 1001 1101
1010 1111
cmp al,0bch
; 1010 1111
-1011 1100
* 0100 0011
sub
al,al
dec al
; 0000 0000
- 0000 0001
*1111 1111
inc
al
;1111 1111
+0000 0001
*1111 1111
; AL=0afh
0
0
1
0
1
; AL=0afh
1
0
1
0
1
AL=00h
0
1
0
0
1
; AL=0ffh
0
0
1
0
1
; AL=00h
0
1
0
0
1
- 4 -
<
/p>
〔习题
2.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
〔习题
2.8
〕请分别用一条汇编语言指令完成如下功能:
(
1
)把
BX
寄存器和
DX
寄存器的内容相加,结果存入
DX
寄存器。
(<
/p>
2
)
用寄存器
B
X
和
SI
的基址变址寻址方式把存储器
的一个字节与
AL
寄存器的内容相加,并把结
< br>果送到
AL
中。
(
3
)用
BX
和位移量
0B2H
的寄存器相对寻址方式把存储器中
的一个字和
CX
寄存器的内容相加,
并
把结果送回存储器中。
(
4
)用位移量为
0520H
的直接寻址方式把存储
器中的一个字与数
3412H
相加,并把结果送回该存
储单元中。
(
5
p>
)把数
0A0H
与
AL
寄存器的内容相加,并把结果送回
AL
中。
〔解答〕
(
1
)
ADD
DX,BX
(
2
)
ADD
AL,[BX+SI]
(
3
)
ADD
[BX+0B2H],CX
- 5 -
(
4
)
ADD
WORD PTR [0520H],3412H
(
5
)
ADD
AL,0A0H
〔习题
2.9
p>
〕设
X
、
Y
、
Z
、
V
均为
16
位带符号数,分别装在
< br>X
、
Y
、
Z
、
V
存储单元中,阅读如下程序段
,
得出它的运算公式,并说明运算结果存于何处。
mov
ax,X
;ax=X
imul Y
;=X*Y
mov
cx,ax
;cx=X*Y
的低
16
位
mox bx,dx
;bx=X*Y
< br>的高
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
的低
1
6
位
+X*Y
的低
16
位
-540
sbb bx,0
bx=Z
< br>的高
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
位
-
(<
/p>
Z
的高
16
位<
/p>
+X*Y
的高
16
位
+
低位进位
-
低位借位)
-
低位
借位
idiv X /X
〔解答〕
[V-(X*Y+Z-540)]/X
AX
存商,
DX
存余数
〔习题
2.10
〕指出下列指令的错误:
(
1
)
xchg [si],30h
-
6 -
(
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
〔解答〕
p>
(
1
)
xchg<
/p>
的操作数不能是立即数
(
2
)不应对
CS
直接赋值<
/p>
(
3
)两个操
作数不能都是存储单元
(
4
)堆栈的操作数不能是字节量
(
5
)
adc
的操作数不能是
段寄存器
(
6
)没有确定是字节还是字操作
(
7
)
in
不支持超过
FFH
的直接寻址
(
8
)
out
只能以
AL/AX
为源操作数
〔习题
2.11
〕给出下列各条指令执行后的结果,以及状态标志
CF
、<
/p>
OF
、
SF
、<
/p>
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
- 7 -
xor ax,ax
p>
;
AX
=
0000
H 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
=<
/p>
OF
=
0
,根据
结果影响其他标志位。
〔习题
p>
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
; 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
次方。移位指令根据移位的数据设置
p>
CF
,根据移位后的结果影响
SF
,
ZF
,
PF
。在进行一位移位时,
根据最高符号位是否改变设置
OF
,如改变则
OF
=
1
。另外,程序注释用
“u”
表示标志无定义(不确定),
“
-
”
表示无影响。
< br>〔习题
2.13
〕编写程序段完成如下要求:
(
1
)用位操作指令实现
AL
(无符号数)乘以
10
(
2
)用逻辑运算
指令实现数字
0 ~ 9
的
ASCII
码与非压缩
BCD
码的互相转换
(
3
)把
中的双字右移
4
位
p>
〔解答〕
(
1
)
;
不考虑进位
mov bl,al
mov cl,3
shl al,cl
;*8
add al,bl
;shl
bl,1
add al,bl
- 8 -
;考虑进位
xor ah,ah
mov bx,ax
mov cl,3
shl ax,cl
add ax,bx
;shl
bx,1
add ax,bx
p>
(
2
)数字
0
p>
~
9
的
ASCII
码是:
30h
~
39h
非压缩
B
CD
码的
0
~
9
是:
00h
~
09h
方法一:
and al,0fh
;
实现
ASCII
到非压缩
BCD
码的转换
or al,30h
;
实现非压缩
BCD
码到
A
SCII
的转换
方法二:
xor al,30h
;求反
D5D4
位,其他不变
;即高
4
p>
位为
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
)
p>
,分别编写用
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
;
字节符号扩展位字
- 9 -