- 论坛徽章:
- 0
|
我写了如下的code.
//stack.c
#include <stdio.h>
void Func(int para)
{
}
int main()
{
int para = -1;
asm("push %eax");
Func(para);
asm("pop %eax");
return 0;
}
gcc -O0 -g -o stack stack.c
main函数反汇编
0x08048329 <main+0>: lea 0x4(%esp),%ecx
0x0804832d <main+4>: and $0xfffffff0,%esp
0x08048330 <main+7>: pushl 0xfffffffc(%ecx)
0x08048333 <main+10>: push %ebp
0x08048334 <main+11>: mov %esp,%ebp
0x08048336 <main+13>: push %ecx
0x08048337 <main+14>: sub $0x14,%esp
0x0804833a <main+17>: movl $0xffffffff,0xfffffff8(%ebp)
0x08048341 <main+24>: push %eax
0x08048342 <main+25>: mov 0xfffffff8(%ebp),%eax
0x08048345 <main+28>: mov %eax,(%esp)
0x08048348 <main+31>: call 0x8048324 <Func>
0x0804834d <main+36>: pop %eax
0x0804834e <main+37>: mov $0x0,%eax
0x08048353 <main+42>: add $0x14,%esp
0x08048356 <main+45>: pop %ecx
0x08048357 <main+46>: pop %ebp
0x08048358 <main+47>: lea 0xfffffffc(%ecx),%esp
0x0804835b <main+50>: ret
很显然,SUB/MOV的参数传递方法会覆盖保存的eax值,如果以后eax有特殊用途(比如在
fpic编译生成的code中),程序会有意想不到的后果。如何理解gcc这种传参方式,为什么
不用push指令呢。
谢谢大家! |
|