6

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;

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

错误与否?

4

0 回答 0