Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何使用内联程序集访问堆栈基指针(rbp)?_Assembly_Inline Assembly_Icc - Fatal编程技术网

Assembly 如何使用内联程序集访问堆栈基指针(rbp)?

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,

我的要求是通过使用内联汇编抵消rbp来访问函数调用参数。但是我找不到合适的操作数约束来指定x86中的基指针。我使用的是英特尔编译器,但它的文档说明它支持GCC风格的内联汇编。因此,基于GCC的示例就足够了。

您可以尝试:

#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寄存器中)。