Assembly 如何使用内联程序集访问堆栈基指针(rbp)?
我的要求是通过使用内联汇编抵消rbp来访问函数调用参数。但是我找不到合适的操作数约束来指定x86中的基指针。我使用的是英特尔编译器,但它的文档说明它支持GCC风格的内联汇编。因此,基于GCC的示例就足够了。您可以尝试:Assembly 如何使用内联程序集访问堆栈基指针(rbp)?,assembly,inline-assembly,icc,Assembly,Inline Assembly,Icc,我的要求是通过使用内联汇编抵消rbp来访问函数调用参数。但是我找不到合适的操作数约束来指定x86中的基指针。我使用的是英特尔编译器,但它的文档说明它支持GCC风格的内联汇编。因此,基于GCC的示例就足够了。您可以尝试: #include <stdio.h> #include <inttypes.h> int main(int argc, char **argv) { uint64_t n; __asm__ __volatile__( "movq %%rbp,
#include <stdio.h>
#include <inttypes.h>
int
main(int argc, char **argv)
{
uint64_t n;
__asm__ __volatile__(
"movq %%rbp, %0\n\t"
: "=r"(n)
);
printf("rbp = 0x%" PRIx64 "\n", n);
return 0;
}
#包括
#包括
int
主(内部argc,字符**argv)
{
uint64\u t n;
__asm\uuuuuuuuuuuuuuuuuu挥发性__(
“movq%%rbp,%0\n\t”
:“=r”(n)
);
printf(“rbp=0x%”PRIx64“\n”,n);
返回0;
}
我知道您要求使用内联程序集,但请注意,在gcc上,您也可以使用\uuUbuiltin\uFrame\uAddress
,这既可以使您不需要内联程序集(yikes),也可以提供比直接程序集更高的框架级别
看这里-
非常感谢。这似乎奏效了。如果可能的话,您还可以解释一下如何用这个进行基指针偏移寻址吗?(例如:“movq 10(%%rbp),%0\n\t”-这对我不起作用)似乎非常有用。虽然不确定英特尔编译器对这些的支持。@chamibuddhika,嗯,我找不到任何保证,但我只是用icc 11测试了它,它给出的结果与我所知道的所有x86调用约定的上述方法相同,无论是32位还是64位,都不强制使用
EBP
/RBP
作为帧指针。因此,访问与帧指针(寄存器)相关的参数的能力是。。。取决于代码的编译方式。在UN*X上的64位x86中,您通常根本无法通过%rbp
访问参数,因为它们没有在堆栈上传递/它们不存在于内存中(但仅存在于arg寄存器中)。