了解汇编 return 到 main
understanding assembly return to main
我有以下代码:
0x401050 <main>: push %ebp
0x401051 <main+1>: mov %esp,%ebp
0x401053 <main+3>: sub [=11=]x8,%esp
0x401056 <main+6>: and [=11=]xfffffff0,%esp
0x401059 <main+9>: mov [=11=]x0,%eax
0x40105e <main+14>: mov %eax,0xfffffffc(%ebp)
0x401061 <main+17>: mov 0xfffffffc(%ebp),%eax
0x401064 <main+20>: call 0x4013a0 <_alloca>
0x401069 <main+25>: call 0x401430 <__main>
0x40106e <main+30>: mov [=11=]x0,%edx
0x401073 <main+35>: add 0x8(%ebp),%edx
0x401076 <main+38>: mov %edx,%eax
0x401078 <main+40>: leave
0x401079 <main+41>: ret
我试图了解 main(寄存器 eax
)的值 returns。
我真的不明白将 0
存储在 0xfffffffc(%ebp)
中然后返回 eax
的目的是什么:
0x40105e <main+14>: mov %eax,0xfffffffc(%ebp)
0x401061 <main+17>: mov 0xfffffffc(%ebp),%eax
以及 0x8(%ebp)
中的内容,因此将其添加到 eax
中后会是什么
0x401073 <main+35>: add 0x8(%ebp),%edx
谢谢!
这段代码显然是在关闭优化的情况下编译的,这就是为什么你会看到奇怪的东西。 return 值将成为 main
的第一个参数,即 argc
。
原始 C 代码可能如下所示:
int main(int argc, char** argv)
{
size_t size = 0; // local variable at -4(%ebp) = 0xfffffffc(%ebp)
_alloca(size);
__main();
return 0 + argc; // argc at 8(%ebp)
}
我有以下代码:
0x401050 <main>: push %ebp
0x401051 <main+1>: mov %esp,%ebp
0x401053 <main+3>: sub [=11=]x8,%esp
0x401056 <main+6>: and [=11=]xfffffff0,%esp
0x401059 <main+9>: mov [=11=]x0,%eax
0x40105e <main+14>: mov %eax,0xfffffffc(%ebp)
0x401061 <main+17>: mov 0xfffffffc(%ebp),%eax
0x401064 <main+20>: call 0x4013a0 <_alloca>
0x401069 <main+25>: call 0x401430 <__main>
0x40106e <main+30>: mov [=11=]x0,%edx
0x401073 <main+35>: add 0x8(%ebp),%edx
0x401076 <main+38>: mov %edx,%eax
0x401078 <main+40>: leave
0x401079 <main+41>: ret
我试图了解 main(寄存器 eax
)的值 returns。
我真的不明白将 0
存储在 0xfffffffc(%ebp)
中然后返回 eax
的目的是什么:
0x40105e <main+14>: mov %eax,0xfffffffc(%ebp)
0x401061 <main+17>: mov 0xfffffffc(%ebp),%eax
以及 0x8(%ebp)
中的内容,因此将其添加到 eax
0x401073 <main+35>: add 0x8(%ebp),%edx
谢谢!
这段代码显然是在关闭优化的情况下编译的,这就是为什么你会看到奇怪的东西。 return 值将成为 main
的第一个参数,即 argc
。
原始 C 代码可能如下所示:
int main(int argc, char** argv)
{
size_t size = 0; // local variable at -4(%ebp) = 0xfffffffc(%ebp)
_alloca(size);
__main();
return 0 + argc; // argc at 8(%ebp)
}