首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 組合語言

Win32 組語參數傳遞與堆疊平衡:STDCALL 慣例深度解析

     編輯:組合語言

呼叫慣例對照表

Win32 組語預設 .model flat, stdcall。wsprintf 例外採 C 慣例,呼叫後需 add esp, n*4。

堆疊幀佈局與參數存取

呼叫前 ESP = X
PUSH 參數3, 參數2, 參數1  → ESP = X-12
CALL  → 推回傳位址     → ESP = X-16
進入副程式:
PUSH EBP                  → ESP = X-20
MOV  EBP, ESP             ; EBP 成堆疊幀基址
[EBP+8]  = 參數1
[EBP+12] = 參數2
[EBP+16] = 參數3
[EBP-4]  = 局部變數1
[EBP-8]  = 局部變數2

標準副程式樣板 (手寫版)

MyProc PROC
    PUSH EBP
    MOV  EBP, ESP
    SUB  ESP, 8           ; 配置 2 個 DWORD 局部變數
    MOV  EAX, [EBP+8]
    SUB  EAX, [EBP+12]    ; 參數1 - 參數2
    ADD  ESP, 8           ; 釋放局部變數
    POP  EBP
    RET  12               ; 彈出 3 個參數 (3*4)
MyProc ENDP

386 專用指令簡化:ENTER / LEAVE

MyProc PROC
    ENTER 8, 0            ; 相當於 PUSH EBP / MOV EBP,ESP / SUB ESP,8
    MOV  EAX, [EBP+8]
    SUB  EAX, [EBP+12]
    LEAVE                 ; 相當於 MOV ESP,EBP / POP EBP
    RET  12
MyProc ENDP

MASM32 高階巨集自動化

MyProc PROC Var1:DWORD, Var2:DWORD
    LOCAL lVar1:DWORD, lVar2:DWORD
    MOV EAX, Var1
    SUB EAX, Var2
    RET
MyProc ENDP

; 呼叫端
MyProc PROTO :DWORD, :DWORD
INVOKE MyProc, x, y       ; 自動 PUSH 參數、檢查型別/個數、CALL

編譯器自動展開 ENTER/LEAVE、計算 RET n、將 Var1 轉為 [EBP+8]。PROTO 宣告讓 INVOKE 能編譯期檢查參數,避免堆疊不平衡導致崩潰。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
A Convention參數入堆疊順序清除堆疊者支援可變參數
C (cdecl)右至左呼叫者是
Syscall左至右被呼叫者否
Stdcall (Win32 標準)右至左被呼叫者否 (除非 VARARG)
Pascal左至右被呼叫者否
Basic/Fortran左至右呼叫者是