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