2012-09-16 58 views
-1

我無法編譯這個,我應該如何在Visual Studio中將[eax + 4]移動到y?在VS中移動[eax + 4]

float x, y, z; 

__asm 
{ 
    mov x,  eax 
    mov y,  [eax+4] 
    mov z,  [eax+8] 
} 

編輯: 「錯誤1錯誤C2424: '+':不當表達在 '第二個操作數'」

+0

[定義變量內C++內聯組件(http://stackoverflow.com/questions/1396265/defining-a-variable-inside-c-inline-assembly) – 2012-09-16 15:29:45

+0

的可能重複的什麼你的意思是「無法編譯」?編譯器說什麼? – svick

回答

3

@Raymond是對的,你可以使用一個臨時寄存器來傳送它。確保你沒有銷燬一個使用過的寄存器。例如:

mov x, eax 
push eax 
push ebx 
mov ebx, eax ; displacement is only possible with ebp or ebx 
mov eax, [ebx+4] 
mov y, eax 
mov eax, [ebx+8] 
mov z, eax 
pop ebx 
pop eax 
+0

位移是*不*僅可用於ebp和ebx。即使在16位中,si和di也可能出現位移,也不會出現bp或bx。 – harold

+1

在[Wikipedia](http://en.wikipedia.org/wiki/X86#Addressing_modes)中,對16位,32位和64位x86處理器的所有可能的尋址模式進行了清晰的總結。 – nrz

+0

@harold:雖然正確,但esi和edi在這些尋址模式中不被稱爲「基址」,而是「索引」。也許我應該說「只允許ebp和ebx成爲流離失所的基礎」是準確的。 –

10

MOV指令不能移動存儲器到存儲器。查看您最喜愛的彙編語言參考,瞭解每條指令規則的更多細節。如果某些東西沒有明確列出,則不允許。你不能只是補充東西。處理器非常挑剔。