Intereting Posts
Как написать C-программу, которая компилирует другие C-программы с использованием GCC? Проблемы с динамическим распределением памяти: main: malloc.c: 3096: sYSMALLOc Реализация канала с использованием общей памяти Как заполнить многоугольник разного цвета, чем границы? как использовать fgets и sscanf для целых чисел в цикле В чем разница между этими двумя точками? Как использовать портированную библиотеку в модуле NaCl? Проблема с заголовком C: #include и “undefined reference” Получение адреса пользовательского типа данных в C из Python с использованием ctypes Пересечение многоугольников Как получить доступ к любому имени переменной в соответствии с индексом цикла с помощью FindWindow с несколькими корневыми windowsми Функция, которая создает переменные с новыми адресами памяти при каждом вызове C указатель указателя по сравнению с записью массива: при переходе к функции Как найти относительный путь, учитывая два абсолютных пути?

Доступ к регистру без использования встроенной сборки с 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 } 

Взято из документации переменных в специфицированных регистрах .

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

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