2016-02-26 62 views
1

我有以下代码:了解装配返回主

0x401050 <main>:   push %ebp 
0x401051 <main+1>:  mov %esp,%ebp 
0x401053 <main+3>:  sub $0x8,%esp 
0x401056 <main+6>:  and $0xfffffff0,%esp 
0x401059 <main+9>:  mov $0x0,%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 $0x0,%edx 
0x401073 <main+35>:  add 0x8(%ebp),%edx 
0x401076 <main+38>:  mov %edx,%eax 
0x401078 <main+40>:  leave 
0x401079 <main+41>:  ret 

我想了解什么值返回从主(注册eax)。 我真的不明白什么是存储在0xfffffffc(%ebp)0然后回到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 

谢谢!

+4

那么,我们应该问你* *为什么你在你的* *代码所有这些多余的操作。如果这不是你的代码,他们必须解释你是如何获得它的。这段代码是从C代码编译的吗?如果是这样,那么原始的C代码是什么,编译器优化设置是什么? – AnT

+0

这段代码是在测验中给我的,除了代码编译自C –

+0

之外,我什么也不知道。所问的问题与C没有关系。这不是反编译或“解释代码”服务。 – Olaf

回答

3

这段代码已经清楚地被编译优化关闭,这就是为什么你看到奇怪的事情。返回值将是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) 
} 
+0

非常感谢! –

+1

对不起,搞砸了返回值。 – Jester

+0

我刚刚开始处理流感,但是'-4(%ebp)'如何转化为_alloca的第一个参数,因为sub $ 0x8,%esp设置了下面的堆栈指针8,其中_EBP_是。鉴于这显然是针对Windows的代码,我想知道调用约定在这里(在Windows上有多种可用)。所以尽管事实上我认为你的答案是好的,但我仍然有点难以理解实际的代码如何工作。 –