前面提到 32 位的寄存器有: EAX EBX ECX EDX ESP EBP ESI EDI; 其中, EAX ECX EDX 是自由使用的.
那么剩下的 EBX ESP EBP ESI EDI 五个寄存器就是应该保护的!
所谓保护, 并不是不可以使用, 而是在使用前先把其中的值寄存在另外一个地方, 用完后再恢复其值.
如果不这样做, 有可能会发生意想不到的错误.
举例:
那么剩下的 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;