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

Delphi 內嵌組合語言教學 (15):需保護的寄存器與堆疊保存

     編輯:Delphi

Delphi register 約定下,EAX/ECX/EDX 為易失性寄存器 (可自由使用);EBX/ESP/EBP/ESI/EDI 為非易失性,**被調用者必須保存並恢復**。違規會導致難以除錯的隨機崩潰。

寄存器分類

類別寄存器用途保存責任
易失性EAX, ECX, EDX參數傳遞、返回值、暫存調用者保存
非易失性EBX, ESI, EDI, EBP, ESP基址、變址、堆疊幀被調用者保存

保護範例:使用 EBX

function Fun(x: Integer): Integer;
asm
  push ebx          { 入棧保存原值 }
  mov ebx, x        { 使用 EBX }
  inc ebx
  mov @Result, ebx
  pop ebx           { 出棧恢復原值 }
end;

測試代碼

procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
  i := Fun(8);
  ShowMessage(IntToStr(i));  { 9 }
end;

進階:多寄存器保存

asm
  push ebx
  push esi
  push edi
  { 使用 EBX/ESI/EDI }
  pop edi
  pop esi
  pop ebx   { 逆序恢復 }
end;

編譯器自動生成

Delphi 編譯器在函數序言/尾聲自動插入非易失性寄存器保存代碼。**手寫組合代碼時必須手動維護**,否則破壞調用約定。

常見錯誤場景

  • 在組合塊中直接修改 ESI/EDI 導致外層循環計數器損壞
  • 修改 EBP 破壞堆疊幀導致區域變量訪問錯誤
  • 修改 ESP 導致堆疊指針錯位,RET 崩潰
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved