在不使用gcc的内联汇编的情况下访问寄存器
我想在不编写内联汇编的情况下读取堆栈指针寄存器值。我想这样做的原因是因为我想将堆栈指针寄存器值分配给数组元素,我发现使用内联汇编访问数组很麻烦。 所以我想做那样的事情。
register "rsp" long rsp_alias; <--- How do I achieve something like that in gcc? long current_rsp_value[NUM_OF_THREADS]; current_rsp_value[tid] = rsp_alias;
gcc有什么可能吗?
有一条捷径:
register long rsp asm ("rsp");
演示:
#include void foo(void) { register long rsp asm ("rsp"); printf("RSP: %lx\n", rsp); } int main() { register long rsp asm ("rsp"); printf("RSP: %lx\n", rsp); foo(); return 0; }
得到:
$ gdb ./a.out GNU gdb (Gentoo 7.2 p1) 7.2 ... Reading symbols from /home/user/tmp/a.out...done. (gdb) break foo Breakpoint 1 at 0x400538: file tc, line 7. (gdb) r Starting program: /home/user/tmp/a.out RSP: 7fffffffdb90 Breakpoint 1, foo () at tc:7 7 printf("RSP: %lx\n", rsp); (gdb) info registers .... rsp 0x7fffffffdb80 0x7fffffffdb80 .... (gdb) n RSP: 7fffffffdb80 8 }
取自Specified Registers中的变量文档。
register const long rsp_alias asm volatile("rsp");
为什么不能在GCC编译的C函数中使用asm
指令? 请参阅GCC内联汇编指南