3

我有一个非常简单的测试例程:

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 指令。任何人都知道为什么会这样?相当混乱...

非常感谢,吉姆

4

2 回答 2

4

编译器已经优化了你的代码——只需要 d ,它的值可以在编译时计算出来。

于 2011-03-02T16:14:42.547 回答
2

你的指示是

 c = 15 + 17 = 32

在二进制

 100000 | 001111= 101111= 0x2f

在第 8 行,您将看到上述数字。

   8:   92 10 20 2f     mov  0x2f, %o1

因此编译器实际上已经在编译时计算以减少指令,从而减少执行所需的大小和时间。

于 2011-03-02T16:25:05.840 回答