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;

这实际上是更好的代码,因为它消除了参数大小歧义 .

错误与否?