Delphi 和 FPC BASM 之间的另一个差异:
program PopTest;
{$IFDEF FPC}
{$mode delphi}
{$asmmode intel}
{$ELSE}
{$APPTYPE CONSOLE}
{$ENDIF}
var
B: LongWord;
procedure Pop(A: LongWord; var B: LongWord);
asm
PUSH EAX
POP [EDX]
end;
begin
Pop(5, B);
Writeln(B);
Readln;
end.
此 32 位代码在 Delphi XE 中按预期工作,并在 FPC (2.6.4) 中产生访问冲突
调试显示POP
指令(在 FPC 编译器中)弹出一个字而不是预期的双字,从而破坏堆栈和过程的返回地址。解决方案是
procedure Pop(A: LongWord; var B: LongWord);
asm
PUSH EAX
POP DWORD [EDX]
end;
这实际上是更好的代码,因为它消除了参数大小的歧义。
错误与否?