为什么gcc将NOP放在函数的末尾?

时间:2014-10-22 03:24:23

标签: c gcc assembly

我创建了一个简单的程序,所以我可以检查它的程序集表示:

//sum.c
int sum(int x, int y)
{
    int t = x + y;
    return t;
}

//main.c
int main()
{
    return sum(4, 7);
}

我使用gcc -o prog main.c sum.c -m32对其进行了编译,并将其与objdump -d prog进行了反汇编。

我注意到关于程序集的一个不寻常的事情是某些函数会附加一系列xchg %ax,%axnop指令。例如,这就是sum的样子:

0804840c <sum>:
804840c:    55            push   %ebp
804840d:    89 e5         mov    %esp,%ebp
804840f:    83 ec 10      sub    $0x10,%esp
8048412:    8b 45 0c      mov    0xc(%ebp),%eax
8048415:    8b 55 08      mov    0x8(%ebp),%edx
8048418:    01 d0         add    %edx,%eax
804841a:    89 45 fc      mov    %eax,-0x4(%ebp)
804841d:    8b 45 fc      mov    -0x4(%ebp),%eax
8048420:    c9            leave  
8048421:    c3            ret    
8048422:    66 90         xchg   %ax,%ax
8048424:    66 90         xchg   %ax,%ax
8048426:    66 90         xchg   %ax,%ax
8048428:    66 90         xchg   %ax,%ax
804842a:    66 90         xchg   %ax,%ax
804842c:    66 90         xchg   %ax,%ax
804842e:    66 90         xchg   %ax,%ax

这些额外说明的目的是什么?由于某种原因,gcc可能会尝试将函数与某些地址对齐吗?

0 个答案:

没有答案