klu*_*udg 6 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.
Run Code Online (Sandbox Code Playgroud)
这个32位代码在Delphi XE中按预期工作,并在FPC中产生访问冲突(2.6.4)
调试显示POP指令(在FPC编译器中)弹出一个单词而不是预期的双字,从而破坏堆栈和过程的返回地址.解决方案是
procedure Pop(A: LongWord; var B: LongWord);
asm
PUSH EAX
POP DWORD [EDX]
end;
Run Code Online (Sandbox Code Playgroud)
这实际上是更好的代码,因为它消除了参数大小歧义.
错误与否?
| 归档时间: |
|
| 查看次数: |
138 次 |
| 最近记录: |