我知道命令行参数正在发生一些事情,但我不知道是什么。有人可以告诉我这段代码吗?
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
答案 0 :(得分:0)
在不让我们知道您的函数如何被调用以及如何声明被调用函数的情况下,我们无法真正帮助您。
例如,不清楚alloca和_main是cdecl,stdcall,fastcall等,以及他们期望的参数数量,您还需要调查它们,看看它们是如何设置,访问和清理堆栈。
至于你的代码,它看起来很奇怪..
它调用alloca和_main而不清理堆栈,所以要么它们不是cdecl,要么是&#34; sub esp,8&#34;为两个呼叫分配空间。然后它将eax归零并将其移动到ebp-4中,这可能是这些调用的参数。但是,大多数堆栈都是未初始化的。在调用alloca后,它没有对eax做任何事情,所以_main是某种类型的fastcall并且期望eax中的参数或你的代码很奇怪。就像ughoavgfhw已经说过的那样,函数最终会返回自己的第一个参数。
此外,您应该附加调试器并单步执行代码以完全理解它。