2017-04-02 517 views
0

我使用rsprbp寄存器在x64內聯彙編中使用VS 2015 C++進行內存索引。是否有可能沒有保存和恢復push rsp, push rbp,... pop rbp,pop rsp?vs 2015中的英特爾x64 C++內聯彙編

__asm{ 

mov rsi, memory 
mov rsp, rsi 
mov rbp, rsi 
... 
movntps [rsp+rdx], ymm0 
... 

} 

在調試模式下,mov rbp, rsi後,存儲器的基地址被改變。這沒問題嗎?

+2

我沒有看到這個代碼可以在vs2015下編譯。這是64位代碼(因爲您的註冊名稱以'r'開頭),vs2015不支持使用內聯asm。也許你的意思是'esi','esp'等? –

回答

0

在編寫內聯彙編時,必須符合編譯器的規則,以確定允許使用哪些寄存器。 VS2015's rules are documented here,我將引用的鍵位:

當使用__asm寫在C/C++函數彙編語言,你並不需要保存的EAX,EBX,ECX,EDX,ESI或EDI寄存器。 ..您應該保留__asm塊的範圍內使用的其他寄存器(例如DS,SS,SP,BP和標誌寄存器)。

閱讀「應該」爲「必須」。因此,對您的問題的狹隘回答是「不,您必須保存並恢復ESP和EBP,如果您想將它們用於任何事情。」

在各行之間進行閱讀,我認爲你實際需要的是用匯編語言編寫你的整個函數。使用Visual Studio,這意味着你將把它放在一個單獨的.ASM文件中。您仍然必須符合calling convention,但不符合編譯器對__asm塊的更嚴格規則。請注意,調用約定仍然要求您保存和恢復ESP和EBP(實際上,除了EAX,ECX和EDX之外的所有寄存器)。

如果你實際編碼爲x64/Windows,那麼,如果我正確地閱讀本文檔,你的不能使用使用__asm;您必須使用單獨的.ASM文件。調用約定是不同的。