Чтение регистра в arm64 с использованием C с использованием компилятора QNX - PullRequest
0 голосов
/ 30 ноября 2018

Я хочу прочитать регистр с именем x0 в arm64 (не x86_64), используя язык Си.Какой самый лучший способ (без ошибок и переносимость?)

Я ищу всю сеть, я просто нахожу несколько способов:

register int *foo asm ("a5");  //1
register int foo asm ("a5");  //2 which right?

или

intptr_t sp;
asm ("movl %%esp, %0" : "=r" (sp) ); //3

ПервыйКстати, есть некоторые ошибки, я думаю.х0 в arm64 это 64 бит.Я думаю, что int * f не может содержать 64-битный адрес.

Второй способ для x86.Кажется, не работает сделать это следующим образом:

asm ("movl %x0, %0" : "=r" (sp) );

Так, как правильно читать регистр в C

1 Ответ

0 голосов
/ 30 ноября 2018

Самый простой способ сделать это так:

uint64_t foo;
asm volatile ("mov %0, x0" : "=r"(foo) ::);

Копирует содержимое регистра x0 в переменную foo.Обратите внимание, что содержимое x0 будет довольно непредсказуемым в любой заданной точке кода;Я не совсем вижу смысла в поиске его содержания.Вы не должны особенно полагаться на x0, содержащую какое-либо конкретное значение в начале или конце функции или прямо перед или после вызова функции.Компилятору C разрешено использовать любой регистр для любых целей в любой точке программы, и известно, что оно использует это право.

...