我在Delphi 10.1的项目有一定的汇编函数是这样的:德尔福汇编代码的win32 VS Win64的
function MyFunc: Word;
asm
PUSH 0
FNSTCW [ESP].Word
POP EAX
end;
我需要在Win64的编制项目,但像POP EAX
一些线条具有E2116 Invalid combination of opcode and operands
错误。
我在Delphi 10.1的项目有一定的汇编函数是这样的:德尔福汇编代码的win32 VS Win64的
function MyFunc: Word;
asm
PUSH 0
FNSTCW [ESP].Word
POP EAX
end;
我需要在Win64的编制项目,但像POP EAX
一些线条具有E2116 Invalid combination of opcode and operands
错误。
而不是将程序集翻译成x64,而应该使用System
单元中的Get8087CW()
函数。它应该可以正常工作了两个平台的(Win32/Win64上):
function MyFunc: Word;
begin
Result := Get8087CW;
end;
为了翻译任何其他的汇编代码从86到64(你这里没有提供),我建议你去学习的x64编程组装。
这是真的,但也许错过了这一点。 x64代码不使用8087单元。它使用SSE单位。 –
@David:我猜这个问题中的代码段只是一个例子,对于这个例子他不需要使用asm。如果他开始将代码重写为x64,则该函数将不会被使用。但是你是正确的,在x64模式下访问FPU控制寄存器是无用的。 –
好的,但是一旦他删除了读取8087 CW的代码,问题就没有了。问题在目前的形式中并不真正有用。 –
使用System单元中的函数Get8087CW,它应该可以在两个平台(Win32/Win64)上正常工作。 –
x86_64不支持32位push/pop –
请注意,x86和x64在其调用约定中使用不同名称的寄存器,并且通常使用不同的操作码。强烈考虑@ AndreiGalatyn的建议,因为你必须(至少)复制所有的功能。 – Caleth