不使用gcc的内联程序集访问寄存器

不使用gcc的内联程序集访问寄存器,c,gcc,x86,inline-assembly,C,Gcc,X86,Inline Assembly,我想在不写内联汇编的情况下读取堆栈指针寄存器值。之所以要这样做,是因为我想将堆栈指针寄存器值分配给数组的元素,并且我发现使用内联汇编访问数组很麻烦。所以我想做类似的事情 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; 注册“

我想在不写内联汇编的情况下读取堆栈指针寄存器值。之所以要这样做,是因为我想将堆栈指针寄存器值分配给数组的元素,并且我发现使用内联汇编访问数组很麻烦。所以我想做类似的事情

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;
注册“rsp”长rsp\u别名 有一条捷径:

register long rsp asm ("rsp");
演示:


摘自文档。

请参阅获取局部变量的地址是否适合您的应用程序?Christoph,常量应该放在哪里,在寄存器之前还是之后?@MetallicPrist:between
register
long
将是最“自然”的方式,事实上,这是一个好主意。是的——我注意到编译器优化了所选寄存器,这就是我包含volatile的原因。我发现
volatile
there(gcc 4.3)@Eric same出现语法错误,并且“警告:优化可能会消除对寄存器变量的读取和/或写入[-Wvolatile register var]`如果我把它移到语法上有效的位置。谢谢Mat,这就是我想要的答案。这不是内联汇编的简写吗?:-)我认为文档已经转移到:如何访问累加器数据??注意到GCC非常明确地不支持这一点。锁定寄存器仅支持在扩展程序集中使用:
register long rsp asm ("rsp");
#include<stdio.h>

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 t.c, line 7.
(gdb) r
Starting program: /home/user/tmp/a.out 
RSP: 7fffffffdb90

Breakpoint 1, foo () at t.c:7
7       printf("RSP: %lx\n", rsp);
(gdb) info registers
....
rsp            0x7fffffffdb80   0x7fffffffdb80
....
(gdb) n
RSP: 7fffffffdb80
8   }