2017-04-02 516 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文件。调用约定是不同的。