2016-10-04 43 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的代碼,問題就沒有了。問題在目前的形式中並不真正有用。 –