内容纲要

MASM 提供了定义函数的方法,但也可以自定义函数。

__cdecl 调用约定

Test_Function_1 Proc C _Var1, _Var2
    mov eax, _Var1
    mov ebx, _Var2
    ret
Test_Function_1 EndP

调用方负责 esp 平衡

invoke Test_Function_1, 1, 2
; 或者
push 2
push 1
call Test_Function_1
add esp, 8

__stdcall 调用约定

Test_Function_2 Proc STDCALL _Var1, _Var2
    mov eax, _Var1
    mov ebx, _Var2
    ret
Test_Function_2 EndP

被调用方负责 esp 平衡

invoke Test_Function_2, 1, 2
; 或者
push 2
push 1
call Test_Function_2

PASCAL 调用约定

从左往右压栈

Test_Function_3 Proc PASCAL _Var1, _Var2
    mov eax, _Var1
    mov ebx, _Var2
    ret
Test_Function_3 EndP
invoke Test_Function_3, 1, 2
; 或者
push 1
push 2
call Test_Function_3

原始汇编 __cdecl 调用约定

Test_Function_4 Proc
    push ebp
    mov ebp, esp
    sub esp, 4

    push ebx
    push esi
    push edi

    mov eax, dword ptr [ebp + 8]
    mov ebx, dword ptr [ebp + 0CH]

    pop edi
    pop esi
    pop ebx

    mov esp, ebp
    pop ebp

    Ret
Test_Function_4 EndP

原始汇编定义函数只能使用 call 调用,不通通过 invoke 调用

push 2
push 1
call Test_Function_4
add esp, 8

对于当前函数而言, 从上往下看栈帧,低地址到高地址,栈从高位向低位生长

  • ebp – 08h 局部变量 2
  • ebp – 04h 局部变量 1
  • ebp push ebp mov ebp, esp 前一个 ebp 地址入栈
  • ret address ebp + 04h call 压入的返回地址
  • ebp + 08h 参数 1
  • ebp + 0ch 参数 2

原始汇编 __fastcall

Test_Function_5 Proc
    push ebp
    mov ebp, esp

    xor eax, eax

    add eax, ecx
    add eax, edx
    add eax, dword ptr [ebp + 08H]
    add eax, dword ptr [ebp + 0CH]

    mov esp, ebp
    pop ebp

    Ret 8
Test_Function_5 EndP

调用方

    push 4
    push 3
    mov edx, 2
    mov ecx, 1
    call Test_Function_5

发表评论

电子邮件地址不会被公开。 必填项已用*标注