2016-10-04 44 views
-2

我在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错误。

+1

使用System单元中的函数Get8087CW,它应该可以在两个平台(Win32/Win64)上正常工作。 –

+0

x86_64不支持32位push/pop –

+0

请注意,x86和x64在其调用约定中使用不同名称的寄存器,并且通常使用不同的操作码。强烈考虑@ AndreiGalatyn的建议,因为你必须(至少)复制所有的功能。 – Caleth

回答

3

而不是将程序集翻译成x64,而应该使用System单元中的Get8087CW()函数。它应该可以正常工作了两个平台的(Win32/Win64上):

function MyFunc: Word; 
begin 
    Result := Get8087CW; 
end; 

为了翻译任何其他的汇编代码从86到64(你这里没有提供),我建议你去学习的x64编程组装。

+3

这是真的,但也许错过了这一点。 x64代码不使用8087单元。它使用SSE单位。 –

+0

@David:我猜这个问题中的代码段只是一个例子,对于这个例子他不需要使用asm。如果他开始将代码重写为x64,则该函数将不会被使用。但是你是正确的,在x64模式下访问FPU控制寄存器是无用的。 –

+2

好的,但是一旦他删除了读取8087 CW的代码,问题就没有了。问题在目前的形式中并不真正有用。 –