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;
这实际上是更好的代码,因为它消除了参数大小歧义.
错误与否?