我创建了一个简单的程序,所以我可以检查它的程序集表示:
//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,%ax
或nop
指令。例如,这就是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可能会尝试将函数与某些地址对齐吗?