前面提到 32 位的寄存器有: EAX EBX ECX EDX ESP EBP ESI EDI; 其中, EAX ECX EDX 是自由使用的.
那麼剩下的 EBX ESP EBP ESI EDI 五個寄存器就是應該保護的!
所謂保護, 並不是不可以使用, 而是在使用前先把其中的值寄存在另外一個地方, 用 完後再恢復其值.
如果不這樣做, 有可能會發生意想不到的錯誤.
舉例:
//使用應該保護的 ebx 寄存器function Fun(x: Integer): Integer;
asm
push ebx {push 是入棧指令, 棧就是系統自動分配的內存}
mov ebx, x
inc ebx
mov @Result, ebx
pop ebx {pop 是出棧指令, 也就是恢復 ebx 寄存器原來的值}
end;
//測試procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
i := Fun(8);
ShowMessage(IntToStr(i)); {9}
end;