我有一个非常简单的测试程序:
void test()
{
int a = 15;
int b = 17;
int c, d;
c = a + b;
d = a | c;
printf("%d", d);
}
然后生成目标文件然后我反汇编目标文件以查看ADD和OR操作的指令字,如下所示:
sparc-elf-objdump -d test.o
由此产生的结果如下:
test.o: file format elf32-sparc
Disassembly of section .text:
00000000 <test>:
0: 11 00 00 00 sethi %hi(0), %o0
4: 90 12 20 00 mov %o0, %o0 ! 0 <test>
8: 92 10 20 2f mov 0x2f, %o1
c: 82 13 c0 00 mov %o7, %g1
10: 40 00 00 00 call 10 <test+0x10>
14: 9e 10 40 00 mov %g1, %o7
18: 01 00 00 00 nop
如您所见,它们既不是ADD指令也不是OR指令。 Anyeone知道为什么会这样吗?相当混乱......
非常感谢, 吉姆
答案 0 :(得分:4)
编译器已经优化了你的代码 - 只需要d,它的值可以在编译时计算。
答案 1 :(得分:2)
您的指示
c = 15 + 17 = 32
二进制
100000 | 001111= 101111= 0x2f
在第8行,您会看到上面的数字。
8: 92 10 20 2f mov 0x2f, %o1
因此,编译器实际上已在编译时计算以减少指令,从而减少执行所需的大小和时间。