2016-08-31 2 views
5
BOOL32 doStuff() { 
    return TRUE; 
} 

НКУ 2,95 для VxWorks 5.x, компиляции приведенного выше кода с -O0 для 32-битных x86, генерируемых следующим кодом:GCC генерирует бесполезные инструкции?

  doStuff: 
0e9de190: push %ebp 
0e9de191: mov  %esp,%ebp 
308   return TRUE; 
0e9de193: mov  $0x1,%eax 
0e9de198: jmp  0xe9de1a0 <doStuff+16> 
312  { 
0e9de19a: lea  0x0(%esi),%esi 
// The JMP jumps here 
0e9de1a0: mov  %ebp,%esp 
0e9de1a2: pop  %ebp 
0e9de1a3: ret 

Все выглядит нормально, пока инструкции JMP и LEA. Для чего они?


Я предполагаю, что это своего рода выравнивание, но я не уверен в этом.

я сделал бы что-то вроде этого:

  doStuff: 
0e9de190: push %ebp 
0e9de191: mov  %esp,%ebp 
308   return TRUE; 
0e9de193: mov  $0x1,%eax 
0e9de1XX: mov  %ebp,%esp 
0e9de1XX: pop  %ebp 
0e9de1XX: ret 
0e9de1XX: fill with lea 0x0, %esi 
+0

Какой код вы пишете, который в конечном итоге был переведен в сборку, сгенерированную выше? Вы должны включить эту информацию, чтобы увеличить шансы получить помощь. – ray

+0

Вы скомпилировались с оптимизацией? Какая платформа/ОС? – rubenvb

+0

Добавлена ​​информация, что это поможет – maxbit89

ответ

8

lea 0x0(%esi),%esi длинный NOP, и JMP перепрыгивает через него. У вас, вероятно, есть древняя версия binutils (содержащая as), чтобы пойти с вашей древней версией gcc.

Поэтому, когда gcc помещает .p2align, чтобы выровнять метку в середине функции, которая в противном случае не является целью ветвления (для какой-то причудливой причины, но это -O0, поэтому она даже не должна быть хорошим кодом), ассемблер сделал длинный NOP и перепрыгнул через него.

Обычно вы переходите только через блок NOP, если их было много, особенно если они были однобайтовыми NOP. Это действительно немой код, поэтому не используйте такие жесткие инструменты. Вы можете попробовать обновить свой ассемблер (но при этом использовать gcc2.95, если вам нужно). Или проверьте, что это не происходит в -O2 или -O3, и в этом случае это не имеет значения.

Если вам по какой-то причине нужно использовать gcc2.95, то просто знайте, что это древний, и это часть компромисса, который вы делаете, чтобы продолжать использовать то, что оно заставляет вас использовать.

+1

С -O2 он выглядит намного лучше ^^ – maxbit89

Смежные вопросы