了解汇编 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)
}