【问题标题】:Accessing a register without using inline assembly with gcc在不使用 gcc 的内联汇编的情况下访问寄存器
【发布时间】:2012-01-02 07:51:36
【问题描述】:

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

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 有没有这样的可能?

【问题讨论】:

标签: c gcc x86 inline-assembly


【解决方案1】:

有一个捷径:

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   }

取自 Variables in Specified Registers 文档。

【讨论】:

【解决方案2】:
register const long rsp_alias asm volatile("rsp");

【讨论】:

  • Christoph,const 应该放在哪里,在 register 之前还是之后?
  • @MetallicPriest:在register 和long 之间是最“自然”的方式,而且确实是个好主意。
  • 是的——我注意到编译器优化了选定的寄存器,这就是我包含 volatile 的原因。
  • 那里出现volatile 语法错误(gcc 4.3)
猜你喜欢
  • 2021-03-21
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 2014-09-19
  • 1970-01-01
  • 2021-05-20
  • 2012-05-05
  • 2020-04-11
相关资源
最近更新 更多