汇编语言程序设计
习题及参考答案
习题一
1.1 把下列 2、8、16 进制数转换成为十进制数
(1)(1011011)2(2)(0.10110)2 (3)(111111.01)2 (4)(1000001.11)2
(5)(377)8 (6)(0.24)8 (7)(3FF)16
(8)(2A.4)16
解: (1)(1011011)2=64+16+8+2+1=91
另解:原式=(5B)16=5×16+11=91
(2)(0.10110)2=0.5+0.125+0.0625=0.6875
(3)(111111.01)2=32+16+8+4+2+1+0.25=63.25
另解:原式=(1000000-1+0.01)2=64-1+0.25=63.25
(4)(1000001.11)2=64+1+0.5+0.25=65.75
(5)(377)8=3×64+7×8+7=255
另解:原式=(400-1)8=4×64-1=255
(6)(0.24)8=2×0.125+4×0.015625=0.3125
(7)(3FF)16=3×256+15×16+15=1023
另解:原式=(400-1)16=4×256-1=1023
(8)(2A.4)16=2×16+10+4×0.0625=42.25
另解:原式=2×16+10+4÷16=42.25
1.2 把下列十进制数转换为 2、16 进制数
(1)(127)10
(5)(1023.5)10 (6)(377)10
(2)(33)10
(3)(0.3)10 (4)(0.625)10
(7)(1/1024)10 (8)(377/32)10
解: (1)(127)10
=64+32+16+8+4+2+1= (111 1111)2=(7F)16
另解:原式=(128-1)10=(1000 0000-1)2=(111 1111)2=(7F)16
(2)(33)10 =32+1= (10 0001)2=(21)16
(3)(0.3)10 = (0.0100 1100 1……)2=(0.4CCC……)16
(4)(0.625)10= 0.5+0.125=(0.101)2=(0.A)16
(5)(1023.5)10 = 512+256+128+64+32+16+8+4+2+1+0.5
=(11 1111 1111.1)2=(3FF.8)16
=256+64+32+16+8+1=(1 0111 1001)2=(179)16
(6)(377)10
(7)(1/1024)10=(0.0000 0000 01)2=(0.004)16
(8)(377/32)10=(256+64+32+16+8+1)÷(32)= (101111001)2÷(100000)2
=(1011.11001)2=(0B.C8)16
1.3 把下列二进制数转换为十六进制数
(1)(100011)2 (2)(0.11101)2 (3)(11111.11)2 (4)(0.00101)2
解: (1)(100011)2=(10’0011)2=23H
(2)(0.11101)2=(0.1110’1000)2=0.E8H
(3)(11111.11)2=(1’1111.1100)2=1F.CH
(4)(0.00101)2=(0.0010’1000)2=0.28H
1.4 把下列十六进制数转换为二进制数
(1)(3B6)16
解: (1)(3B6)16
(2)(100)16
(3)(80.2)16
(4)(2FF.A)16 =(0010 1111 1111.1010)2
(2)(100)16
=(0011 1011 0110)2
=(0001 0000 0000)2
=(1000 0000.0010)2
(3)(80.2)16
(4)(2FF.A)16
1.5 如果用 24b 储存一个无符号数,这个数的范围是什么?如果储存的是一个
补码表示的有符号数,那么这个数的范围又是什么?
答:如果用 24b 储存一个无符号数,这个数的范围应为:0~224-1
如果用 24b 储存一个补码表示的有符号数,这个数的范围应为:-223~+223-1
1.6 两个无符号数,它们的大小等于十进制数 210 和 303,用 N 位二进制存储
时,相加产生了进位,用 N+1 位二进制存储时,相加没有产生进位。这个 N 等
于多少?为什么?
答:210+303=513, 29<513<210,取 N=9 时,相加会产生进位,取 N=10,相加
就不会产生进位,因此,本题中 N=9。
1.7 两个 8 位二进制无符号数相加后没有产生进位,符号标志 SF=1,它们和应
在什么范围内?如果 SF=0,那么和又在什么范围内?
答:如果 SF=1,它们的和应在 27~28-1,也就是 128~255 之内。
如果 SF=0,它们的和应在 0~27-1,也就是 0~127 之内。
1.8 两个 8 位补码表示的有符号数相加时,什么情况下会使进位标志等于“1”?
相减时,又是什么情况下会使借位标志等于“1”?
答:两个 8 位补码表示的有符号数相加时,下列情况会使进位标志等于“1”:
两个负数相加;
两个异号数相加,和为正(不会产生溢出)。
两个 8 位补码表示的有符号数相减时,下列情况会使借位标志等于“1”:
两个同号数相减,差为负(不会产生溢出);
正数减负数(有可能产生溢出);
1.9 用符号“〉”把下面的数按从大到小的顺序“连接”起来
[X2]原=10110111
[X3]反=10110111
[X4]补=10110110
[X5]无符
解 : X1=-0100 1001B, X2=-011 0111B, X3=-0100 1000B, X4=-0100 1010B,
[X1]补=10110111
号数=10110111
X5=+1011 0111B
因此:X5>X2>X3>X1>X4
1.10 用 8 位补码完成下列运算,用二进制“真值”的格式给出运算结果,并指
出运算后 CF、OF、ZF、SF、PF 标志位的状态。
(1)127+126
(2)126-127
(3)-100-120
(
4
)
-100-(-120)
解: (1)127+126
[127]补=0111 1111,[126]补=0111 1110,
[127+126]补=1111 1101,[127+126]=-0000 0011(溢出)
COZSP=01010
(2)126-127
[126]补=0111 1110,[-127]补=1000 0001,
[126-127]补=1111 1111,[126-127]=-000 0001
COZSP=10011
(3)-100-120
[-100]补=1001 1100,[-120]补=1000 1000,
[-100-120]补=0010 0100,[-100-120]=+0010 0100(溢出)
COZSP=01001
(4)-100-(-120)
[-100]补=1001 1100,[-120]补=1000 1000,[ [-120]补]求补=0111 1000,
[-100-(-120)]补=0001 0100,[-100-(-120)]=+0001 0100
COZSP=00001
1.11 把二进制代码 1001011101011000 分别“看作”是:
(1)二进制无符号数 (2)二进制补码 (3)压缩 BCD 码 (4)非压
缩 BCD 码
哪一种情况下它代表的“值”最大?
答:看作二进制无符号数时,它代表的“值”最大。
分析:看作二进制补码时,它代表一个负数,而其它的情况下,它均为正数。因
此,看作二进制补码时,它代表的值最小。
把这组代码用十六进制数字形式写出:9758
对于无符号数,它的值等于十六进制的 9758H;
对于压缩 BCD 码,它的值等于十进制的 9758,显然小于 9758H;
对于非压缩 BCD 码,它的值等于十进制的 78,显然更小于 9758H;
因此,看作二进制无符号数时,它代表的“值”最大。
1.12 CPU 使用“寄存器”有什么好处?为什么?
答:CPU 使用寄存器主要有两个好处:
(1) 寄存器位于 CPU 内部,访问寄存器比访问内存储器速度快;
(2) 寄存器数量大大少于内存储器单元个数,标识寄存器使用的二进制代
码比标识内存储器单元使用的二进制代码少得多,可以缩短指令长
度。
1.13 已知 8086 系统某存储单元物理地址为 12345H,写出 4 个可以与它对应的
“逻辑地址”。
答:可以与物理地址 12345H 对应的逻辑地址有:
1234H:0005H, 1230H:0045H, 1220H:0145H, 1224H:0105H, ……
1.14 已知 8086 系统某存储单元物理地址为 12345H,可以与它对应的“逻辑地
址”中,段基址最大值,最小值分别是多少?
答:可以与物理地址 12345H 对应的逻辑地址中,段基址的最大值为 1234H,最
小值为 0235H。
分析:偏移地址取最大值时,对应的段基址为最小。偏移地址可选的最大值为
0FFF5H(最后一位必须为 5),因此最小的段基址=(12345H-0FFF5H)
/10H=0235H。
偏移地址取最小值时,对应的段基址最大。偏移地址可选的最小值为 0005H
(最后一位必须为 5),因此最大的段基址=(12345H-0005H)/10H=1234H。
8086 微机最多可以有多少个不同的“段基址”?为什么?
1.15
答:由于段基址由 16 位二进制数表示,因此可以有 216=65536 个不同的段基址。
1.16 在图 1-6 中,假设已有(R1)=X,(R2)=Y,分别用它的机器指令和符号
指令写出计算 R0←4X+2Y 的程序。想一想,怎样做才能尽量减少指令数量?
答:假设已有(R1)=X,(R2)=Y,可以编制如下计算 R0←4X+2Y 的程序:
机器指令
注释
符号指令
MOV R0, R1
ADD R0, R1
ADD R0, R2
ADD R0, R0
减少指令的方法是先计算出 2X+Y,然后再计算 4X+2Y。可以有多种不同的
1 000 00 01(81H) R0←X
1 001 00 01(91H) R0←X+X
1 001 00 10(92H) R0←2X+Y
1 001 00 00(90H) R0←4X+2Y
写法。
1.17 什么是“逻辑地址”?什么是“线性地址”?什么是“物理地址”?它们
如何转换?
答:由段的起始地址(段基址)或者段的编号和段内相对地址两部分表示的地址
称为“逻辑地址”。
经过“分段机构”处理后,用一组二进制代码表示的地址称为“线性地址”。
经过“分页机构”处理后,用一组二进制代码表示的存储单元的“真实”的
地址称为“物理地址”。物理地址的位数等于地址总线的宽度。
工作在实地址模式下的 80X86MPU 不使用线性地址,物理地址=段基址×16+
段内偏移地址。
80X86MPU 工作在保护模式下时,分段机构用段的编号在“段描述符表”中
找到段的起始地址,加上偏移地址得到“线性地址”。
分页机构把线性地址从高位到低位分解为“页组地址:页地址:页内地址”
三部分,由页组地址(页组号)查找“页组表”,获得该页组对应的“页表”首
地址。然后用页地址(页号)去查“页表”,得到该页的起始地址,拼接上页内
地址,得到“物理地址”。
保护模式下也可以关闭分页机构,此时线性地址等于物理地址。
1.18
32 位 80X86 和 16 位 80X86 中央处理器的段寄存器有什么不同?
答:16 位 80X86CPU 的段寄存器长度为 16 位,存放的是一个段起始地址的高
16 位。
32 位 80X86CPU 的段寄存器长度仍然为 16 位,存放的是一个段在“段描述
符表”中的序号,表的编号(对每一个程序,有两张段描述符表)和这个段的优
先级别。
1.19 叙述“保护模式”和“虚拟 8086 方式”之间的关系。
答:保护模式是 32 位 80X86MPU 的工作方式,对当前运行的所有任务实施保护。
虚拟 8086 方式是保护模式下某一个任务的工作模式,该任务使用类似于实
地址方式下的物理地址产生方式,使用 1MB 的虚拟内存空间,主要用于运行 8086
程序。
习题二
2.1 某数据段内有如下数据定义:
X
db 30, 30H, ‘ABC’, 2-3, ?, 11001010B
dw 0FFH,-2, “CD”
dd 20 dup(15, 3 dup(?), 0)
db 3 dup(?)
dw Z-X
Y
Z
W
假设变量 X 的偏移地址为 20H。
(1) 按照图2-1 的格式写出变量X 各数据在内存中的具体位置和相关内存单
元的值。
(2) 写出变量 Y,Z 的偏移地址。
(3) 写出变量 W 的值
答:(1)变量 X 各数据在内存中的具体位置和相关内存单
0020H
元的值如右图。
(2) 变量 Y 的偏移地址为 002EH;
变量 Z 的偏移地址为 002EH+4×5×20=01BEH
(3) 变量 W 的值等于变量 Z 和 X 偏移地址之差
01BEH-0020H=019EH
它等于变量 X、Y 所占用内存单元的字节数。
X
1EH
30H
41H
42H
43H
0FFH
00H
0CAH
0FFH
00H
0FEH
0FFH
44H
43H
2.2
80x86 指令系统有哪几种类型的指令操作数?比较
使用不同类型操作数后的指令长度和指令执行时
间。
答:80X86 指令系统按照长度划分,有以下四种指令操作
数:
002EH
Y
(1) 寄存器操作数,指令短,执行速度快;
(2) 立即操作数,指令较长,执行速度快;
(3) 寄存器间接寻址和基址变址寻址表示的内存储器操作数,这类指令长
度较短,执行速度较慢(需要访问存储器);
(4) 直接地址,寄存器相对寻址,相对的基址变址寻址表示的内存储器操
作数,这类指令长度较长,执行速度较慢(需要计算物理地址,访问
存储器)。
2.3 下列指令的源操作数段基址在哪个段寄存器中?
(1)MOV AX, [BP][SI]
(3)MOV AX, 2[EBP*1]
(5)MOV AX, 2[EBP][EAX] (6)MOV AX, [ECX][EBP*4]
(7)MOC AX, [EDX][EBP] (8)MOV AX, ES:10[EBP][EAX*2]
(2)MOV AX, CS:8[DI]
(4)MOV AX, FS:4[ESP]
答:各指令源操作数段基址使用的段寄存器如下:
(1) SS (2) CS (3) SS (4) FS
(5) SS (6) DS (7) DS (8) ES
2.4 判断下列指令是否正确。若不正确,指出错误原因
(2)MOV SI, DL
(1)MOV AX, [EBX]
(3)MOV EBP, [ESP][EAX*3](4)LEA AX, 3006H
(5)MOV [BP][DI], 0
(7)MOV ES, 1000H
(9)MOV AX, CX+2
(6)MOV [SI], [DI]
(8)MOV AX, X+2
(10)MOV
[EAX][EAX*2], AL
答: (1)指令 MOV AX, [EBX] 是正确的。
(2)指令 MOV
(3)指令 MOV
(4)指令 LEA AX, 3006H 是错误的,LEA 指令的源操作数必须为内存操作
SI, DL 是错误的,两个操作数类型不匹配。
EBP, [ESP][EAX*3] 是错误的,比例因子不能为 3。
数。
(5)指令 MOV
(6)指令 MOV
(7)指令 MOV
[BP][DI], 0 是错误的,操作数类型无法确定。
[SI], [DI] 是错误的,不能同时出现两个内存操作数。
ES, 1000H 是错误的,装载段寄存器时,源操作数不能
为立即数。
(8)如果“X”是用常数表达式定义的符号(例如:X
5+6),或
者是用“DW”定义的内存变量,指令 MOVAX, X+2 是正确的。否则这条指令
是错误的。
EQU
(9)指令 MOV
AX, CX+2 是错误的,源操作数表达式 CX+2 不是一个可
以直接计算的“常数表达式”。
(10)指令 MOV [EAX][EAX*2], AL 是正确的。
2.5 现有(DS)=2000H ,(BX)=0100H,(SI)=0002H,(20100H)=12H,(20101H)
=34H,(20102H)=56H,(20103H)=78H,(21200H)=2AH,(21201H)=4CH,
(21202H)=0B7H,(21203H)=65H,说明下列指令执行后 AX 寄存器的内容。
(1)MOV AX, 1200H
(2)MOV AX, BX
(3)MOV AX, [1200H]
(4)MOV AX, [BX]
(5)MOV AX, 1100H[BX]
(6)MOV AX, [BX][SI]
(7)MOV AX, 1100H[BX][SI]
答 :(1)指令 MOV AX, 1200H 执行后,(AX)=1200H (立即数操作数)。
(2)指令 MOV
(3)指令 MOV
AX, BX 执行后,(AX)=0100H (寄存器操作数)。
AX, [1200H] 执 行 后 , (AX)=4C2AH ( 直 接 地 址 ,
EA=1200H)
(4)指令 MOV
EA=0100H)
(5)指令 MOV
EA=1200H)
(6)指令 MOV
EA=0102H)
AX, [BX] 执行后,(AX)=3412H(寄存器间接寻址,
AX, 1100H[BX] 执行后,(AX)= 4C2AH(相对地址,
AX, [BX][SI] 执行后,(AX)=7856H(基址变址寻址,
(7)指令 MOV
AX, 1100H[BX][SI] 执行后,(AX)=65B7H
(相对基址变址寻址,EA=1202H)