前面提到 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;

posted on 2008-01-25 17:19  万一  阅读(3607)  评论(7编辑  收藏  举报