第3章 8086/8088 指令系统和寻址方式 习题答案(部分)
1.1 总结计算机中十进制、二进制、八进制及十六进制数的书写形式。123D、0AFH、
77Q、1001110B 分别表示什么计数制的数?
答案:123D、0AFH、77Q、1001110B 分别表示十进制、十六进制、八进制、二进制。
1.2 字长为8 位、16 位二进制数的原码、补码表示的最大数和最小数分别是什么?
答案:8 位原码表示的最大数:(27-1)、8 位补码表示的最大数:(27-1)、8 位原码表示的最小数:-(27-1)、8 位补码表示的最小数-27。
16 位原码表示的最大数:(215-1)、16 位补码表示的最大数:(215-1)、16 位原码表示的最小数:-(215-1)、16 位补码表示的最小数-215。
1.3 把下列十进制数分别转换为二进制数和十六进制数。
(1)125 (2)255 (3)72 (4)5090
答案:(1) 125 二进制数:0111 1101B;十六进制数:7DH。
(2)255 二进制数:1111 1111B;十六进制数:0FFH。
(3)72 二进制数:0100 1000B;十六进制数:48H。
(4)5090 二进制数:0001 0011 1110 0010B;十六进制数:13E2H。
1.4 把下列无符号二进制数分别转换为十进制数和十六进制数。
(1)1111 0000 (2)1000 0000 (3)1111 1111 (4)0101 0101
答案:(1)1111 0000 十进制数:240D;十六进制数:0F0H。
(2)1000 0000 十进制数:128D;十六进制数:80H。
(3)1111 1111 十进制数:255D;十六进制数:0FFH。
(4)0101 0101 十进制数:85D;十六进制数:55H。
1.5 把下列无符号十六进制数分别转换为十进制数和二进制数。
(1)FF (2)ABCD (3)123 (4)FFFF
答案:(1)FF 十进制数:255D;二进制数;1111 1111B。
(2)ABCD 十进制数:43981D;二进制数;1010 1011 1100 1101B。
(3)123 十进制数:291D;二进制数;0001 0010 0011B。
(4)FFFF 十进制数:65535D;二进制数;1111 1111 1111 1111B。
1.6 分别用8 位二进制数和16 位二进制数写出下列十进制数的原码和补码。
(1)16 (2)-16 (3)+0 (4)-0 (5)127 (6)-128 (7)121 (8)-9
答案:
(1)16 8 位二进制数原码:0001 0000 补码:0001 0000;16 位二进制数原码:0000 0000
0001 0000 补码: 0000 0000 0001 0000。
(2)-16 8 位二进制数原码:1001 0000 补码:1111 0000;16 位二进制数原码:1000 0000
0001 0000 补码:1111 1111 1111 0000。
(3)+0 8 位二进制数原码:0000 0000 补码:0000 0000;16 位二进制数原码:0000 0000
0000 0000 补码:0000 0000 0000 0000。
(4)-0 8 位二进制数原码:1000 0000 补码:0000 0000;16 位二进制数原码:1000 0000
0000 0000 补码: 0000 0000 0000 0000。
(5)127 8 位二进制数原码:0111 1111 补码: 0111 1111;16 位二进制数原码:0000 0000
0111 1111 补码: 0000 0000 0111 1111。
(6)-128 8 位二进制数原码:无 补码: 1000 0000 ;16 位二进制数原码:1000 0000
1000 0000 补码:1111 1111 1000 0000。
(7)121 8 位二进制数原码:0111 1001 补码: 0111 1001;16 位二进制数原码:0000 0000
0111 1001 补码: 0000 0000 0111 1001。
(8)-9 8 位二进制数原码:1000 1001 补码:1111 0111;16 位二进制数原码:1000 0000
1000 1001 补码:1111 1111 1111 0111。
1.7 试实现下列转换。
(1)[X]原=10111110B,求[X]补 (2)[X]补=11110011B,求[-X]补
(3)[X]补=10111110B,求[X]原 (4)[X]补=10111110B,求[X]反
答案:(1) 1100 0010 (2) 0000 1101 (3) 1100 0010 (4) 1011 1101
1.8 假设两个二进制数A=01101010,B=10001100,试比较它们的大小。
(1)A、B 两数均为带符号的补码数 (2)A、B 两数均为无符号数
答案:(1)A、B 两数均为带符号的补码数:A>B
(2)A、B 两数均为无符号数:A<B
1.9 下列各数均为十进制数,请用8 位二进制数补码计算下列各题,用十六进制数表示
其运算结果,并判断是否溢出,验证教材中所给的判断依据。
(1)90+71 (2)90-71 (3)-90-71 (4)-90+71 (5)-90-(-71)
答案:(1)90+71=161>127 溢出
[90]补+[71]补=0101 1010+0100 0111=1010 0001=0A1H=[-91]补
(2)90-71=19<127 无溢出
[90]补+[-71]补=0101 1010+1011 1001=0001 0011=13H=[19]补
(3)-90-71=-161<-128 溢出
[-90]补+[-71]补=1010 0110+1011 1001=0101 1111=5FH=[95]补
(4)-90+71=-19>-128 无溢出
[-90]补+[71]补=1010 0110+0100 0111=1110 1101=0EDH=[-19]补
(5)-90-(-71)=-19>-128 无溢出
[-90]补+[71]补=1010 0110+0100 0111=1110 1101=0EDH=[-19]补
3.10 完成下列8 位二进制数的逻辑运算。
(1)11001100∧10101010 (2)11001100∨10101010
(3)11001100⊕10101010 (4)10101100∧10101100
(5)10101100⊕10101100 (6)10101100∨10101100
(7)10101100
答案:(1)11001100∧10101010=1000 1000 (2)11001100∨10101010=1110 1110
(3)11001100⊕10101010=0110 0110 (4)10101100∧10101100=1010 1100
(5)10101100⊕10101100=0000 0000 (6)10101100∨10101100=1010 1100
(7)10101100=0101 0011
1.11 以下均为2 位十六进制数,试说明当把它们分别看作无符号数或字符的ASCII 码
值,它们所表示的十进制数和字符是什么?
(1)30H (2)39H (3)42H (4)62H (5)20H (6)7H
答案:(1)30H 所表示的十进制数是:48D;字符是:0。
(2)39H 所表示的十进制数是:57D;字符是:9。
(3)42H 所表示的十进制数是:66D;字符是:B。
(4)62H 所表示的十进制数是:98D;字符是:b。
(5)20H 所表示的十进制数是:32D;字符是:sp 空格。
(6)7H 所表示的十进制数是:7D;字符是:BEL 报警。
1.12 把以下十进制数分别以压缩BCD 码、非压缩BCD 码、ASCII 码串表示。
(1)2 (2)78
答案:(1)2 压缩BCD 码:0010、非压缩BCD 码:0000 0010、ASCII 码:011 0010
(2)78 压缩BCD 码:0111 1000、非压缩BCD 码:0000 0111 0000 1000、ASCII 码:0110111
011100
1.13 设浮点数格式如下图所示:
阶码、尾数均以补码表示,基数为2,求:+25.6 和-361.25 的规格化浮点数。
答案:1) +25.6D=11001.1001100110B=0.110011001100110×25
+5=0101B,补码:0101,尾数:[ 0.110011001100110]补=0.110011001100110
规格化浮点数:0 0000101 0 110011001100110
2) -361.25D=-101101001.01B=29×(-0.101101001010000)
+9=1001,补码:1001,尾数:[ -0.101101001010000]补=1.010010110110000
规格化浮点数:0 0001001 1 010010110110000
1.14 设某计算机用12 位表示一个浮点数,该浮点数从高位到低位依次为:阶符1 位、
阶码3 位(原码表示)、数符1 位、尾数7 位(补码表示),则0 100 1 0110011 的真值是多少?
答案:-9.625
3.1 8086 汇编语言指令的寻址方式有哪几类?哪种寻址方式的指令执行速度最快?
解:寻址方式分为:立即数寻址方式、寄存器操作数寻址方式和存储器操作数寻址方式。
其中,寄存器操作数寻址方式的指令执行速度最快。
3.2 在直接寻址方式中,一般只指出操作数的偏移地址,那么,段地址如何确定?如果要用
某个段寄存器指出段地址,指令中应该如何表示?
解:默认的数据访问,操作数在DS 段;堆栈操作在SS 段;串操作源操作数(SI)在DS
段,目的操作数(DI)在ES 段;用BP 作为指针在SS 段。如果要显式地指定段地址,则在操作
数中规定段寄存器。例如:
MOV AX, ES:(BX+10H)
3.3 8086 系统中,设DS=1000H,ES=2000H,SS=1200H,BX=0300H,SI=0200H,
BP=0100H,VAR 的偏移量为0600H,请指出下列指令的目标操作数的寻址方式,若目
标操作数为存储器操作数,计算它们的物理地址。
(1)MOV BX,12 ;目标操作数为寄存器寻址
(2)MOV [BX],12 ;目标操作数为寄存器间址 PA=10300H
(3)MOV ES:[SI],AX ;目标操作数为寄存器间址 PA=20200H
(4)MOV VAR,8 ;目标操作数为存储器直接寻址 PA=10600H
(5)MOV [BX][SI],AX ;目标操作数为基址加变址寻址 PA=10500H
(6)MOV 6[BP][SI],AL ;目标操作数为相对的基址加变址寻址 PA=12306H
(7)MOV [1000H],DX ;目标操作数为存储器直接寻址 PA=11000H
(8)MOV 6[BX],CX ;目标操作数为寄存器相对寻址 PA=10306H
(9)MOV VAR+5,AX ;目标操作数为存储器直接寻址 PA=10605H
3.4下面这些指令中哪些是正确的?那些是错误的?如果是错误的,请说明原因。
(1)XCHG CS,AX ;错,CS 不能参与交换
(2)MOV [BX],[1000] ;错,存储器之不能交换
(3)XCHG BX,IP ;错,IP 不能参与交换
(4)PUSH CS ;错,CS 不能为PUSH 的操作数
(5)POP CS ;错,不能将数据弹到CS 中
(6)IN BX,DX ;输入/输出只能通过AL/AX
(7)MOV BYTE[BX],1000 ;1000 大于255,不能装入字节单元
(8)MOV CS,[1000] ;CS 不能作为目标寄存器
(9)MOV BX,OFFSET VAR[SI] ;OFFSET 只能取变量的偏移地址
(10)MOV AX,[SI][DI] ;SI、DI 不能成为基址加变址
(11)MOV COUNT[BX][SI],ES:AX ;AX 是寄存器,不能加段前缀
3.5 试述以下指令的区别:
⑴ MOV AX,3000H 与 MOV AX,[3000H]
答案:⑴ MOV AX,3000H 指令源操作数的寻址方式为立即寻址方式,指令执行结果为:
(AX)=3000H。 而MOV AX,[3000H]指令源操作数的寻址方式为直接寻址方式,指令执行结
果为:DS:3000H)_AX。
⑵ MOV AX,MEM 与 MOV AX,OFFSET MEM
答案:⑵ MOV AX,MEM 指令源操作数的寻址方式为直接寻址方式,指令执行结果为:
DS:MEM)_AX。 而MOV AX,OFFSET MEM 指令的执行结果是把MEM 的偏移量送AX。
⑶ MOV AX,MEM 与 LEA AX,MEM
答案:⑶ MOV AX,MEM 指令的执行结果是LDS:MEM)_AX。 而LEA AX,MEM
的执行结果是把MEM 的偏移量送AX。
(4) JMP SHORT L1 与 JMP NEAR PTR L1
答案:JMP SHORT L1 为段内无条件短程转移,跳转的范围不得超过带符号的8 位二进
制数表示的字节范围;JMP NEAR PTR L1 为段内无条件近程转移,跳转的范围不得超过带
符号的16 位二进制数表示的字节范围。
(5) CMP DX,CX 与 SUB DX ,CX
答案:CMP DX,CX 是比较,也是利用减法比较,但是dx 中的值不变,标志寄存器改
变。SUB DX ,CX 是做减法运算,dx 中为减后的值,标志寄存器改变
(6)MOV [BP][SI],CL 与 MOV DS:[ BP][SI],CL
答案:BP 默认的段基址是SS,物理地址PA=SS+BP+SI;第二个重定义为DS 段基址,
物理地址PA=DS+BP+SI
3.6 设DS=2100H,SS=5200H,BX=1400H,BP=6200H,说明下面两条指令所进行的
具体操作:
MOV BYTE PTR [BP], 20H
MOV WORD PTR [BX], 20H
解:前一条指令是把立即数20H,传送至堆栈段(BP 的默认段)偏移量由BP 规定的字节单
元,地址为:52000H+6200H=58200H
第二条指令是把立即数20H,传送至数据段(BX 的默认段)偏移量由BX 规定的字单元,地
址为:21000H+1400H = 22400H。
3.7 设当前 SS=2010H,SP=FE00H,BX=3457H,计算当前栈顶的地址为多少?当执
行 PUSH BX 指令后,栈顶地址和栈顶2 个字节的内容分别是什么?
答案:当前栈顶的地址=2FF00H
当执行PUSH BX 指令后,栈顶地址=2FEFEH
(2FEFEH)=57H
(2FEFFH)=34H
3.8 设DX=78C5H,CL=5,CF=1,确定下列各条指令执行后,DX 和CF 中的值。
(1) SHR DX,1 ;DX=3C62H CF=1
(2) SAR DX,CL ;DX=03C6H CF=0
(3) SHL DX,CL ;DX=18A0H CF=1
(4) ROR DX,CL ;DX=2BC6H CF=0
(5) RCL DX,CL ;DX=18B7H CF=1
(6) RCR DH,1 ;DX=BCC5H CF=0
3.9 设AX=0A69H,VALUE 字变量中存放的内容为1927H,写出下列各条指令执行
后寄存器和CF、ZF、OF、SF、PF 的值。
AX CF ZF OF SF PF
(1)XOR AX,VALUE ; 134EH 0 0 0 0 1
(2)AND AX,VALUE ; 0821H 0 0 0 0 1
(3)SUB AX,VALUE ; F142H 1 0 0 1 1
(4)CMP AX,VALUE ; 0A69H 1 0 0 1 1
(5)NOT AX ; F596H X X X X X
(6)TEST AX,VALUE ; 0A69H 0 0 0 0 1
3.10 设AX 和BX 中是符号数,CX 和DX 是无符号数,请分别为下列各项确定CMP
和条件转移指令。
CX 值超过DX 转移。
AX 未超过BX 转移。
DX 为0 转移。
CX 值等于小于DX 转移。
答案:
(1) CMP CX,DX
JA NEXT
(2) CMP AX,BX
JLE NEXT
(3) CMP DX,0
JZ NEXT
(4) CMP CX,DX
JBE NEXT
3.11 阅读分析下列指令序列:
ADD AX,BX
JNO L1
JNC L2
SUB AX,BX
JNC L3
JNO L4
JMP L5
若AX 和BX 的初值分别为以下5 种情况,则执行该指令序列后,程序将分别转向何处
(L1~L5 中的一个)。
AX=13C6H, BX=80DCH
AX=0B568H,BX=54B7H
AX=42C8H, BX=608DH
AX=0D023H,BX=9FD0H
AX=9FD0H, BX=0D023H
答案:(1)转L1:不溢出,转移到L1 处;
(2)转L1:不溢出,转移到L1 处;
(3)转L2:溢出,不转移到L1 处,进位CF=0,转移到L2 处;
(4)转L3:溢出,不转移到L1 处,进位CF=1,不转移到L2 处,减法借位CF=0,转移
到L3 处;
(5)转L5:溢出,不转移到L1 处,进位CF=1,不转移到L2 处,减法借位CF=1,不转
移到L3 处,不溢出OF=0,转移到L4 处;
3.12 用普通运算指令执行BCD 码运算时,为什么要进行十进制调整?具体地讲,在进行
BCD 码的加、减、乘、除运算时,程序段的什么位置必须加上十进制调整指令?
解:因为8086 指令把操作数作为二进制数进行二进制运算,要得到正确的BCD 结果,需
要进行调整。在加、减、乘法指令之后加上BCD 调整指令,而在除法指令之前先用BCD 调
整指令再用除法指令。
3.13 在编写乘除法程序时,为什么常用移位指令来代替乘除法指令?编写一段程序,实
现将BX 中的数除以10,结果仍然放在BX 中。
解:用移位指令时,左移l 位相当于将操作数乘2,右移1 位相当于将操作数除2。用
移位指令实现一些简单的乘除法程序,比用乘法指令和除法指令进行乘、除运算要快得多。
用除法指令实现:
MOV CL 0AH
MOV AX,BX
IDIV CL
MOV BX,AX
3.14 串操作指令使用时特别要注意和SI,DI 这两个寄存器及方向标志DF 密切相关。请
具体就指令MOVSB/MOVSW、CMPSB/CMPSW、SCASB/SCASW、LODSB/LODSW、
STOSB/STOSW 列表说明和SI、DI 及DF 的关系。
解答:
SI DI DF
MOVSB/MOVSW 指出源地
址
指出目的地
址
不带 REP 重复前缀时,DF=0,每传送一次,SI、
DI 加1 或加2,DF=1,SI、DI 则减1 或减2
CMPSB/CMPSW
存放源字
符串首地
址
存放目的字
符串首地址
DF=0,每次比较后,SI、DI 加1 或加2,CX 减
1,DF=1,SI、DI 减1 或减2,CX 减1
SCASB/SCASW 无 指出字符串
首址偏移量 无
LODSB/LODSW 作为地址
指针
存放处理结
果
DF=1 时,地址作增量修改,DF=0 时,地址作减
量修改
STOSB/STOSW 无 存放目的地
址 无
3.15 用串操作指令设计实现以下功能的程序段:首先将100H 个数从2170H 处搬到
1000H 处,然后,从中检索相等于VAL 中字符的单元,并将此单元值换成空格符。
解答:
START:MOV AX, DS
MOV ES, AX
MOV SI, 2170H
MOV DI, 1000H
MOV CX, 100H
CLD
REP MOVSB
ANOTHER:MOV DI, 1000H
MOV AL, VAL
MOV CX, 100H
CLD
AGE: SCASB
JZ FIN
DEC CX
JNZ AGE
JMP OVER
FIN: MOV BYTE PTR[DI-1],20H
CMP CX,0
JNZ AGE
OVER: RET
3.16 求双字长数DX∶AX 的相反数。
答:
NEG DX
NEG AX
SBB DX,0
3.17 试对数据段偏移地址为101H 单元中的单字节数求补后存入102H,最高位不变,
低7 位取反存入103H,高4 位置1,低4 位不变,存入104H。
答:
MOV AX,[0101H]
MOV BX,AX
MOV CX,AX
NOT AX
MOV [0102H],AX
XOR BX,7FH
MOV [0103H],BX
AND CX,0F0H
MOV [0104H]
3.19 试编写一个程序,比较两个同长字符串STRING1 和STRING2 所含字符是否相同,
若相同MATCH 单元赋值1,若不相同MATCH 单元赋值0。
答案:
程序段为:
;数据定义
STRING1 DB ‘ABCDEFGHIJK ;串1,作为源串
STRING2 DB ‘ABCDFGKJ ;串2,作为目标串
MATCH DB ? ;定义MATCH 单元
;功能代码
MOV AX,SEG STRING1
MOV DS,AX ;源串段地址送DS
MOV AX,SEG STRING2
MOV ES,AX ;目标串段地址送ES
LEA SI, STRING1 ;源串偏移地址送SI
LEA DI, STRING2 ;目标串偏移地址送DI
MOV CX, STRING1- STRING2 ;重复次数送CX
CLD ;地址增
REPE CMPSB ;相等继续比较,不相等退出
JZ EQUAL ;退出时,若ZF=1,表示两串相等
MOV MATCH,0 ;不相同,MATCH 单元赋值0
JMP OVER
EQUAL:MOV MATCH,1 ;相同MATCH 单元赋值1
OVER:HLT
3.20 编写代码,计算a+10b+100c+20d,其中a、b、c、d 均为单字节无符号数,结果为16
位,存入SUM 开始的两单元中。
data segment
ma db 12
mb db 21
mc db 86
md db 150
SUM dw 0
data ends
code segment
assume ds:data,cs:code
start:mov ax,data
mov ds,ax
mov dh,0
mov dl,ma
mov ah,0
mov al,10
mul mb
add dx,ax
mov ah,0
mov al,100
mul mc
add dx,ax
mov ah,0
mov al,20
mul md
add dx,ax
mov SUM,dx
code ends
end start
3.21 试编写一段程序把LIST 到LIST+100 中的内容传到BLK 到BLK+100 中去。
答案:
程序段为:
MOV AX,SEG LIST
MOV DS,AX ;源串段地址送DS
MOV AX,SEG BLK
MOV ES,AX ;目标串段地址送ES
LEA SI, LIST ;源串偏移地址送SI
LEA DI, BLK ;目标串偏移地址送DI
MOV CX, 101 ;重复次数送CX
CLD ;地址增
REP MOVSB
3.23 设CS:0100H 单元有一条两字节的JMP SHORT LAB 指令,若其中的位移量为:
⑴56H ⑵80H ⑶78H (4)0E0H
试写出转向目标的物理地址是多少?
答:因为CS:0100H 处存放两字节指令JMP SHORT LAB,所以当执行该指令时
(IP)=0102H
(1) 转向目标的物理地址是:(CS)*10H+(IP)+0056H=CS:0058H
(2) 转向目标的物理地址是:(CS)*10H+(IP)+0FF80H=CS:0082H;80H 对应的负数为-80H
(向上转移,负位移量)
(3) 转向目标的物理地址是:(CS)*10H+(IP)+0078H=CS:0180H
(4) 转向目标的物理地址是:(CS)*10H+(IP)+0FFE0H=CS:00E2H;E2H 对应的负数为
-1EH(向上转移,负位移量)
3.24 不使用除法指令,将堆栈段中10H、11H 单元中的双字节带符号数除以8,结果存
入12H、13H 单元(注:多字节数存放格式均为低位在前,高位在后)。
POP AX
POP BX
TEST AX,8000H ;测试被除数符号位
MOV CL,3
JZ ZS ;若为正数,跳转到ZS
SAR AX,CL
JMP OVER
ZS: SHR AX,CL
OVER:PUSH AX
3.26 数据段中3030H 起有两个16 位的带符号数,试求它们的积,存入3034H-3036H 单
元中。
答案:
MOV AX,[3030H]
MOV BX,[3032H]
IMUL BX
MOV [3034H],AX
MOV [3036H]