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;
实际上是更好的代码,因为它消除了参数大小歧义。
错误与否?