【发布时间】:2019-03-05 11:03:21
【问题描述】:
我想将此 asm 代码转换为 C++ 或 C,我可以理解 main 中的主要概念,例如变量 decleration 和调用函数,但我被 push 和 pop 命令卡住了,无法理解它们是如何工作的。
main:
0x080489cc <+0>: lea ecx,[esp+0x4]
0x080489d0 <+4>: and esp,0xfffffff0
0x080489d3 <+7>: push DWORD PTR [ecx-0x4]
0x080489d6 <+10>: push ebp
0x080489d7 <+11>: mov ebp,esp
0x080489d9 <+13>: push ebx
0x080489da <+14>: push ecx
0x080489db <+15>: sub esp,0x10
0x080489de <+18>: call 0x80488b0 <__x86.get_pc_thunk.bx>
0x080489e3 <+23>: add ebx,0xa261d
0x080489e9 <+29>: mov DWORD PTR [ebp-0xc],0x1
0x080489f0 <+36>: mov DWORD PTR [ebp-0x10],0x3
0x080489f7 <+43>: mov DWORD PTR [ebp-0x14],0x9
0x080489fe <+50>: sub esp,0x4
0x08048a01 <+53>: push DWORD PTR [ebp-0x14]
0x08048a04 <+56>: push DWORD PTR [ebp-0x10]
0x08048a07 <+59>: push DWORD PTR [ebp-0xc]
0x08048a0a <+62>: call 0x8048a34 <blender>
0x08048a0f <+67>: add esp,0x10
0x08048a12 <+70>: sub esp,0x8
0x08048a15 <+73>: push eax
0x08048a16 <+74>: lea eax,[ebx-0x2ed18]
0x08048a1c <+80>: push eax
0x08048a1d <+81>: call 0x804f100 <printf>
0x08048a22 <+86>: add esp,0x10
0x08048a25 <+89>: mov eax,0x0
0x08048a2a <+94>: lea esp,[ebp-0x8]
0x08048a2d <+97>: pop ecx
0x08048a2e <+98>: pop ebx
0x08048a2f <+99>: pop ebp
0x08048a30 <+100>: lea esp,[ecx-0x4]
0x08048a33 <+103>: ret
blender:
0x08048a34 <+0>: push ebp
0x08048a35 <+1>: mov ebp,esp
0x08048a37 <+3>: call 0x8048a51 <__x86.get_pc_thunk.ax>
0x08048a3c <+8>: add eax,0xa25c4
0x08048a41 <+13>: mov edx,DWORD PTR [ebp+0x8]
0x08048a44 <+16>: mov eax,DWORD PTR [ebp+0xc]
0x08048a47 <+19>: add eax,edx
0x08048a49 <+21>: add eax,eax
0x08048a4b <+23>: imul eax,DWORD PTR [ebp+0x10]
0x08048a4f <+27>: pop ebp
0x08048a50 <+28>: ret
【问题讨论】:
-
阅读stack on wikipedia,如果您有具体问题,请回来编辑您的帖子。