我在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