Доступ к регистру без использования встроенной сборки с gcc - PullRequest
8 голосов
/ 20 ноября 2011

Я хочу прочитать значение регистра указателя стека без записи встроенной сборки. Причина, по которой я хочу это сделать, заключается в том, что я хочу присвоить значение регистра указателя стека элементу массива, и мне неудобно обращаться к массиву используя встроенную сборку. Поэтому я бы хотел сделать что-то подобное.

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?

Ответы [ 3 ]

16 голосов
/ 20 ноября 2011

Есть ярлык:

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   }

Взят из Переменные в указанномРегистры Документация.

8 голосов
/ 20 ноября 2011
register const long rsp_alias asm volatile("rsp");
1 голос
/ 20 ноября 2011

Почему вы не можете использовать инструкцию asm внутри функции C, скомпилированной GCC? См. GCC Inline Assembly Howto

...