- 论坛徽章:
- 11
|
一个例子:- int sum (int x, int y)
- {
- int a = 0;
- a = x;
- a += y;
- return a;
- }
- int main (int argc, char *argv[])
- {
- int x, y, result;
- x = 0x12;
- y = 0x34;
- result = sum (x, y);
- return 0;
- }
复制代码- gcc -m32 stack.c -o stack
复制代码- objdump -d stack > stack.dump
复制代码- 080483b2 <main>:
- 80483b2: 55 push %ebp
- 80483b3: 89 e5 mov %esp,%ebp
- 80483b5: 83 ec 18 sub $0x18,%esp
- 80483b8: c7 45 f4 12 00 00 00 movl $0x12,-0xc(%ebp)
- 80483bf: c7 45 f8 34 00 00 00 movl $0x34,-0x8(%ebp)
- 80483c6: 8b 45 f8 mov -0x8(%ebp),%eax
- 80483c9: 89 44 24 04 mov %eax,0x4(%esp)
- 80483cd: 8b 45 f4 mov -0xc(%ebp),%eax
- 80483d0: 89 04 24 mov %eax,(%esp)
- 80483d3: e8 bc ff ff ff call 8048394 <sum>
- 80483d8: 89 45 fc mov %eax,-0x4(%ebp)
- 80483db: b8 00 00 00 00 mov $0x0,%eax
- 80483e0: c9 leave
- 80483e1: c3 ret
复制代码 汇编指令中的sub $0x18,%esp为main()的栈帧预留了0x18字节的空间,这里一直没想明白,网上有些资料说ABI约定栈帧按照16字节对齐,哪位大神帮忙解释一下这段代码中的0x18字节是怎样得出的,16字节边界对齐的原理是怎样的?谢谢。 |
|