第二章习题答案9. 在32 位计算机中运行一个 C 语言程序,在该程序中出现了以下变量的初值,请写出它们对应的机器 数(用十六进制表示) 。 (1)int x=-32768 (4)char c=’@’ 本题要点: (1) 数据要根据其类型要表示到足够的位数,如题(3) ,要写成 0000FFFA,而不是 FFFA (2) 因为求机器数,所以负数要用补码表示 (3) 浮点数要用 IEEE 754 标准编码,要注意是 float 还是 double,分别编码:阶码位数、尾数位数、 偏置常数各不相同。要表示到足够的位数。 (4) 16 进制数后面要写 H 标识,二进制数后面要写 B 标识 参考答案: (1)FFFF8000H 解:-215=-1000 0000 0000 0000B,负数符号位为 1,int 型整数表示为 32 位, 故机器数为 1…1 1000 0000 0000 0000=FFFF8000H (2)020AH 解:522=10 0000 1010B,正数符号位为 0,short 型整数表示为 16 位, 故机器数为 0000 0010 0000 1010=020AH (3)0000FFFAH 解: 65530=216-1-5=1111 1111 1111 1010B, unsigned 型整数表示为 32 位, 无符号位 (高位补 0) , 故机器数为 0000FFFAH (4)40H 解:’@’的ASCII 码是 40H,char 型表示为 8 位(5)BF8CCCCCH 解:-1.1=-1.00011 [0011]…B=-1.000 1100 1100 1100 1100 1100B, float 型浮点数,阶码为 127+0=01111111(8 位) ,整数部 1 为隐藏位,负数符号位为 1, 故机器数为 1 01111111 000 1100 1100 1100 1100 1100=BF8CCCCCH (6)40250000 00000000H 解:10.5=1010.1B=1.0101B?23(左规) , (2)short y=522 (5)float a=-1.1 (3)unsigned z=65530 (6)double b=10.5 Double 型浮点数,阶码为 1023+3=100 0000 0010,整数部 1 为隐藏位,正数符号位为 0, 故机器数为 0 100 0000 0010 0101 [0000]=40250000 00000000H 10. 在32 位计算机中运行一个 C 语言程序,在该程序中出现了一些变量,已知这些变量在某一时刻的机 器数(用十六进制表示)如下,请写出它们对应的真值。 (1)int x:FFFF0006H (4)char c:2AH (2)short y:DFFCH 5)float a:C4480000H (3)unsigned z:FFFFFFFAH (6)double b:C024800000000000H 本题要点 (1) 正确换算,结果最好表示成 10 进制 (2) 注意数据类型,准确区分有符号数和无符号数,有符号数最高位为 1 时为负数 (3) 正确解析浮点数 参考答案: (1)-65530 解:FFFF0006H=1…1 0000 0000 0000 0110B,最高位为 1,所以为负数,int 型整数,所以真值 为其余为取反加 1,故x= -1111 1111 1111 1010B= -(65535-5)=-65530 (2)-8196 解:DFFCH=1101 1111 1111 1100B=-010 0000 0000 0100B,最高位为 1,所以为负数,short 型整 数,所以真值为其余为取反加 1,故y=-(8192+4)=-8196 (3)4294967290(或232-6) 解:FFFFFFFAH=1…1 1010B,最高位虽然为 1,但为 unsigned 型整数,所以解析为正整数,直 接展开换算,故z=232-6=4294967290 (4)字符’*’ 解:2AH=0010 1010B,故c的值是 42,且c表示字符,故c为字符’*’ (5)-800 解:C4480000H=1100 0100 0100 1000 0…0B,因为是 float 型浮点数数据,所以按照 IEEE 754 标 准解析。符号位为 1,所以为负数;阶码为 10001000,减掉偏置常数 127 后有:阶为 136-127=9;尾数考 虑隐藏位为:-1.1001B,故a=-1.1001B?29= -11 0010 0000B= -800 (6)-10.25 解:C024800000000000H=1100 0000 0010 0100 1000 0 0…0B,因为是 double 型浮点数,所以按照 IEEE 754 标准解析。符号位为 1,所以为负数;阶码为 100 0000 0010, ,减掉偏置常数 1023 后有:阶为 1026-1023=3;尾数考虑隐藏位为 1.01001B,故b=-1.01001B?23= 1010.01B=-10.25 17. 以下是一个由反汇编器生成的一段针对某个小端方式处理器的机器级代码表示文本,其中,最左边 是指令所在的存储单元地址,冒号后面是指令的机器码,最右边是指令的汇编语言表示,即汇编指 令。已知反汇编输出中的机器数都采用补码表示,请给出指令代码中划线部分表示的机器数对应的 真值。 80483d2: 81 ec b8 01 00 00 80483d8: 8b 55 08 80483db: 83 c2 14 80483de: 8b 85 58 fe ff ff 80483e4: 03 02 80483e6: 89 85 74 fe ff ff 80483ec: 8b 55 08 80483ef: 83 c2 44 80483f2: 8b 85 c8 fe ff ff 80483f8: 89 02 80483fa: 8b 45 10 80483fd: 03 45 0c 8048400: 89 85 ec fe ff ff 8048406: 8b 45 08 8048409: 83 c0 20 本题要点: (1) 注意数据是小端方式,所以要注意字节的编排,如5字节: b8 01 00 00 ,表示的数是 “000001b8” 。 (2) (3) 上述指令都是整数运算指令,所以所有的数据均按整数换算 正确换算,不要计算错了 sub mov add mov add mov mov add mov mov mov add mov mov add &0x1b8, %esp 0x8(%ebp), %edx $0x14, %edx 0xfffffe58(%ebp), %eax (%edx), %eax %eax, 0xfffffe74(%ebp) 0x8(%ebp), %edx $0x44, %edx 0xfffffec8(%ebp), %eax %eax, (%edx) 0x10(%ebp), %eax 0xc(%ebp), %eax %eax, 0xfffffeec(%ebp) 0x8(%ebp), %eax $0x20, %eax 参考答案: (1)440 解:b8 01 00 00:4 字节,但考虑小端数据格式,所以机器数为 000001B8H,符号位为 0,所以 为正整数,直接展开,真值为+1 1011 1000B = 440 (2)20 解:14:单字节,机器数即为 14H,符号位为 0,解析为正整数,所以真值为+1 0100B = 20 (3)-424 解:58 fe ff ff:4 字节,考虑小端数据格式,所以机器数为 FFFFFE58H,符号位为 1,所以为 负数,真值为其余位取反加 1,所以真值为:-1 1010 1000B = -424 (4)-396 解:74 fe ff ff:4 字节,考虑小端数据格式,所以机器数为 FFFFFE74H,符号位为 1,所以为 负数,真值为其余位取反加 1,所以真值为:-1 1000 1100B = -396 (5)68 解:44:单字节,机器数即为 44H,符号位为 0,解析为正整数,所以真值为+100 0100B=68 (6)-312 解:c8 fe ff ff:4 字节,考虑小端数据格式,所以机器数为 FFFFFEC8H,符号位为 1,所以为 负数,真值为其余位取反加 1,所以真值为:-1 1000 1100B = -312 (7)16 解:10:单字节,机器数即为 10H,符号位为 0,解析为正整数,所以真值为+10000B=16 (8)12 解:0c:单字节,机器数即为 0CH,符号位为 0,解析为正整数,所以真值为:+1100B=12 (9)-276 解:ec fe ff ff:4 字节,考虑小端数据格式,所以机器数为 FFFFFEECH,符号位为 1,所以为 负数,真值为其余位取反加 1,所以真值为:-1 0001 0100B = -276 (10)32 解:20:单字节,机器数即为 20H,符号位为 0,解析为正整数,所以真值为+00100000B=32 21.以下是两段 C 语言代码,函数 arith( )是直接用 C 语言写的,而optarith( )是对 arith( )函数以某个确定 的M和N编译生成的机器代码反编译生成的。根据 optarith( ),可以推断函数 arith( ) 中M和N的值 各是多少? #define #define int { int result = 0 ; result = x*M + y/N; return result; } int optarith ( int x, int y) { int t = x; x