Вопрос касательно разборки выхода - PullRequest
3 голосов
/ 02 марта 2011

У меня очень простая процедура тестирования:

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 для поиска. Кто-нибудь идея, почему это так? Весьма запутанно ...

Большое спасибо, Jim

Ответы [ 2 ]

4 голосов
/ 02 марта 2011

Компилятор оптимизировал ваш код - требуется только d, и его значение можно вычислить во время компиляции.

2 голосов
/ 02 марта 2011

Ваши инструкции

 c = 15 + 17 = 32

В двоичном

 100000 | 001111= 101111= 0x2f

В строке 8 вы увидите номер выше.

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

Таким образом, компилятор фактически рассчитал во время компиляции, чтобы уменьшить количество инструкций и тем самым уменьшить размер и время, необходимое для выполнения.

...