FPC BASM32 POP bug?

时间:2015-12-30 09:24:24

标签: delphi freepascal fpc basm

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;

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

错误与否?

0 个答案:

没有答案