计算机系统基础——上机作业2

实验1:变量输出与机器数分析

1.1 运行代码并分析输出

源代码

1
2
3
4
5
6
7
8
#include <stdio.h>
int main() {
int x = -1;
unsigned u = 2147483648;
printf("x = %u = %d.\n", x, x);
printf("u = %u = %d.\n", u, u);
return 0;
}

编译与运行

1
2
gcc -o test1 test1.c
./test1

输出结果(假设32位系统):

1
2
x = 4294967295 = -1.
u = 2147483648 = -2147483648.

结果分析

  • x = %u
    xint 类型的 -1,二进制补码为 0xFFFFFFFF。用 %u(无符号)解释时,0xFFFFFFFF 对应 4294967295
  • x = %d
    正常输出 -1
  • u = %u
    uunsigned 类型的 2147483648(即 0x80000000),直接输出为 2147483648
  • u = %d
    %d(有符号)解释 0x80000000,最高位为1,表示负数,结果为 -2147483648

1.2 反汇编分析机器数

步骤

  1. 生成目标文件:
    1
    gcc -c test1.c -o test1.o
  2. 反汇编查看变量赋值:
    1
    objdump -d -M intel test1.o

关键汇编代码(简化):

1
2
mov DWORD PTR [rbp-4], 0xffffffff   ; x = -1 (机器数 0xFFFFFFFF)
mov DWORD PTR [rbp-8], 0x80000000 ; u = 2147483648 (机器数 0x80000000)

变量机器数总结
| 变量 | 机器数(十六进制) |
| —— | ————————— |
| x | 0xFFFFFFFF |
| u | 0x80000000 |


实验2:表达式结果与反汇编分析

2.1 验证表达式结果

源代码

1
2
3
4
5
6
7
8
#include <stdio.h>
int main() {
printf("-1 < 0\t\t -> %d\n", (-1 < 0));
printf("-1 < 0U\t -> %d\n", (-1 < 0U));
printf("2147483647 > -2147483647 - 1\t -> %d\n", (2147483647 > -2147483647 - 1));
printf("2147483647U > -2147483647 - 1\t -> %d\n", (2147483647U > -2147483647 - 1));
return 0;
}

编译与运行

1
2
gcc -o test2 test2.c
./test2

输出结果

1
2
3
4
-1 < 0           -> 1
-1 < 0U -> 0
2147483647 > -2147483647 - 1 -> 1
2147483647U > -2147483647 - 1 -> 0

结果分析

  1. -1 < 0
    有符号比较,-1 小于 0,结果为真(1)。
  2. -1 < 0U
    0U 是无符号,-1 被转换为无符号数 0xFFFFFFFF(4294967295),远大于 0U,结果为假(0)。
  3. 2147483647 > -2147483647 - 1
    右侧表达式 -2147483647 - 1 等于 -2147483648INT_MIN),有符号比较,2147483647INT_MAX)大于 INT_MIN,结果为真(1)。
  4. 2147483647U > -2147483647 - 1
    左侧是无符号,右侧 INT_MIN 被转换为无符号数 0x80000000(2147483648),比较 21474836472147483648,结果为假(0)。

2.2 反汇编分析表达式

步骤

  1. 生成目标文件:
    1
    gcc -c test2.c -o test2.o
  2. 反汇编查看比较指令:
    1
    objdump -d -M intel test2.o

关键汇编代码(以 -1 < 0U 为例):

1
2
3
mov DWORD PTR [rbp-4], 0xffffffff   ; -1 的机器数
cmp DWORD PTR [rbp-4], 0 ; 比较时,-1 被视为无符号数 4294967295
setb al ; 设置结果(0 表示假)

总结

  • 类型转换规则决定了比较结果。
  • 反汇编显示编译器如何处理有符号与无符号的隐式转换。

实验报告建议

  1. 源代码与输出结果:附上代码及运行结果。
  2. 反汇编截图:展示变量赋值和表达式比较的汇编代码。
  3. 分析
    • 解释类型转换对输出的影响。
    • 说明反汇编中机器数与表达式比较的底层实现。

如果需要更详细的反汇编代码或具体步骤解释,请随时告知!