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;
これは、パラメーター サイズのあいまいさがなくなるため、実際にはより優れたコードです。
バグかどうか?