-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 
4

1 回答 1

0

如果不让我们知道您的函数是如何被调用的以及被调用的函数是如何声明的,我们实际上无法为您提供帮助。

例如,不清楚 alloca 和 _main 是否是 cdecl、stdcall、fastcall 等以及它们期望多少参数,您还需要调查它们并查看它们如何设置、访问和清理堆栈。

至于你的代码,它看起来有点奇怪..

它调用 alloca 和 _main 而不清理堆栈,因此它们不是 cdecl 或“sub esp,8”为这两个调用分配空间。然后它将 eax 归零并将其移动到 ebp-4 中,这可能是这些调用的参数。但是,大多数堆栈都未初始化。在调用 alloca 之后,它不会对 eax 做任何事情,所以要么 _main 是某种快速调用,并且需要 eax 中的参数,要么你的代码很奇怪。就像 ughoavgfhw 已经说过的,函数最后返回它自己的第一个参数。

此外,您应该附加一个调试器并单步执行您的代码以完全理解它。

于 2013-08-12T10:34:11.377 回答