为什么gcc输出机器代码有nop指令

Pue*_*Pop 15 c objdump nop

每次我做一个objdump -d我总是看到asm代码与批量的nop指令(指令什么都不做)

例如,采取相同的程序:

#include <stdio.h>
#include <math.h>

int main()
{
    printf("Hello World!\n");
    printf("cos:  %f\n", cos(1));
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

示例的objdump在入口点的末尾有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 
Run Code Online (Sandbox Code Playgroud)

这只是众多例子中的一个,但你明白了.为什么C代码以这种方式编译?提前致谢.

ken*_*ytm 18

所述nops的加入到强制下一个功能对齐到4字节边界.(注意最后一个地址nop将是40047c,可被4整除)


Hei*_*upp 8

通常这些只是用来做填充,以便后续的东西再次在单词或边界上开始,因为访问未在字边界上对齐的任意代码对于cpu而言要昂贵得多.