logo资料库

汇编语言程序设计习题及答案(百度文库).doc

第1页 / 共80页
第2页 / 共80页
第3页 / 共80页
第4页 / 共80页
第5页 / 共80页
第6页 / 共80页
第7页 / 共80页
第8页 / 共80页
资料共80页,剩余部分请下载后查看
习题一
习题二
习题三
习题四
习题五
习题八
汇编语言程序设计 习题及参考答案
习题一 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)
分享到:
收藏