在不使用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内联汇编指南