无需与GCC使用内联装配,访问寄存器[英] Accessing a register without using inline assembly with gcc

本文是小编为大家收集整理的关于无需与GCC使用内联装配,访问寄存器的处理方法,想解了无需与GCC使用内联装配,访问寄存器的问题怎么解决?无需与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<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   }

取自 em> 文档.

其他推荐答案

register const long rsp_alias asm volatile("rsp");

本文地址:https://www.itbaoku.cn/post/359320.html