Почему у машинного кода gcc есть инструкции nop - PullRequest
15 голосов
/ 05 мая 2011

Каждый раз, когда я делаю objdump -d, я всегда вижу asm-код с пакетами nop-инструкций (инструкции, которые ничего не делают)

Например, возьмите эту же программу:objdump для exampe имеет 2 nops в конце точки входа

0000000000400450 <_start>:
400450: 31 ed                   xor    %ebp,%ebp
400452: 49 89 d1                mov    %rdx,%r9
400455: 5e                      pop    %rsi
400456: 48 89 e2                mov    %rsp,%rdx
400459: 48 83 e4 f0             and    $0xfffffffffffffff0,%rsp
40045d: 50                      push   %rax
40045e: 54                      push   %rsp
40045f: 49 c7 c0 00 06 40 00    mov    $0x400600,%r8
400466: 48 c7 c1 70 05 40 00    mov    $0x400570,%rcx
40046d: 48 c7 c7 34 05 40 00    mov    $0x400534,%rdi
400474: e8 bf ff ff ff          callq  400438 <__libc_start_main@plt>
400479: f4                      hlt    
40047a: 90                      nop
40047b: 90                      nop 

И это только один из многих примеров, но вы поняли идею.Почему код C скомпилирован таким образом?Заранее спасибо.

Ответы [ 2 ]

18 голосов
/ 05 мая 2011

nop s добавляются для принудительного выравнивания следующей функции по 4-байтовой границе.(обратите внимание, что адрес, следующий за последним nop, будет 40047c, который делится на 4)

8 голосов
/ 05 мая 2011

Очень часто они просто используются для заполнения, так что последующие вещи начинаются со слова или границы снова, так как доступ к произвольному коду, который не выровнен по границам слова, намного дороже для процессора.

...