在下面的简化代码中,Len没有被分配。
function Test64(const Val: Int64; var Len: Integer): Integer;
begin
asm
mov [Len], $1
end;
end;
我正在64位模式下编译。
不过,这在Delphi(32位)中有效。我如何让它在拉撒路工作?
在编写asm时,我总是喜欢明确用于传递参数的寄存器。它使发现寄存器滥用变得更加容易。
所以我会这样写:
function Test64(const Val: Int64; var Len: Integer): Integer;
asm
mov dword ptr [rdx], $1
end;
我怀疑你实际上是在为x86编译,因为Delphix64编译器不支持像你在问题中那样混合Pascal和asm。所以,据我所知,问题中的代码不是在Delphix64编译器下编译的。
你可以看到,在我上面的代码中,我没有混合Pascal和asm。这是一个纯asm函数。我的建议是,即使在x86上,也要始终以这种方式进行编码。这样做可以确保编译器不会干扰堆栈和寄存器的使用。
在x86中,代码为:
function Test64(const Val: Int64; var Len: Integer): Integer;
asm
mov dword ptr [edx], $1
end;
在Windows x64上,Microsoft定义ABI,并且只有一个调用约定。记录如下:https://msdn.microsoft.com/en-us/library/zthk2dkh.aspx
非Microsoft平台的x64 ABI(System V x64 ABI)不同。我以为你的目标是Windows。
Delphi x86 ABI如下所述:http://docwiki.embarcadero.com/RADStudio/en/Program_Control