Delphi 過程與函數中,僅 EAX、ECX、EDX 三個寄存器可自由使用。修改其他寄存器(EBX、ESI、EDI、EBP、ESP 等)必須在退出前恢復原值,否則會破壞調用約定導致程序崩潰。
procedure Proc(x, y, z: Integer);
var a, b: Integer;
begin
asm
MOV a, ECX
MOV b, EDX
end;
ShowMessage(Format('%d,%d', [a, b]));
{EAX 無法直接測試,因其兼作返回值}
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Proc(11, 22, 33); {顯示: 33,22}
end;
| 參數順序 | 寄存器 | 說明 |
|---|---|---|
| 第 1 參數 | EAX | 函數中兼作返回值 |
| 第 2 參數 | EDX | — |
| 第 3 參數 | ECX | — |
| 第 4+ 參數 | 堆棧 | 通過堆棧傳遞 |
注意: 此規則僅適用於默認 register 調用約定。使用 stdcall、cdecl 等約定時參數全走堆棧。