Почему машинный код выхода gcc имеет nop-инструкции

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

Например, возьмите эту же программу:

#include  #include  int main() { printf("Hello World!\n"); printf("cos: %f\n", cos(1)); return 1; } 

Objdump для примера имеет 2 nops в конце точки входа

 0000000000400450 : 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  400479: f4 hlt 40047a: 90 nop 40047b: 90 nop 

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

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

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