汇编中的函数调用我们需要着重讲述一下。一般我们用 call 发起调用,最后需要用 ret/retn/retf 来返回。我们逐个来看汇编中的函数调用。
1、相关指令
- call ADDRESS:
发起调用,根据 ADDRESS 的地址决定是发起段内调用还是段间调用。当是段内调用时,将 eip 入栈,然后 jmp 到 ADDRESS 处;当是段间调用时,将 cs、eip 依次入栈,然后 jmp 到 ADDRESS 处。
- enter:
进行堆栈准备工作,将 ebp 原来的内容入栈,将当前 esp 存入 ebp。相当于:
push ebp
mov ebp, esp
- leave:
恢复堆栈,是 enter 指令的逆向操作,如你所想:
mov esp, ebp
pop ebp
- retn [NUMBER]:
段内返回,不带 [] 内的 NUMBER 时,表示是无参的函数调用或者 __cdecl 调用约定,当有 NUMBER 时,返回后将 esp 的值加 NUMBER,表示将入栈的参数全部出栈,一般是 __stdcall 调用约定。作用如下: