Как записать указанный адрес в регистр, используя встроенную сборку - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть следующее утверждение:

asm volatile("ldr r0, =0x10000");

Вместо записи 0x10000 я хочу написать параметр, чтобы он выглядел так:

uint32_t addr = 0x20000;
asm volatile("ldr r0, =addr");

как мне это сделать?

Я использую процессор ARM.

Я хочу сделать это:

At the end I want to do this:

asm volatile("ldr r0, =0x10000");
asm volatile("ldr r0, [r0]");
asm volatile("mov sp, r0");

то же самое для ПК

спасибо.

1 Ответ

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

gcc вполне способен генерировать эти инструкции, поэтому вы можете сделать:

void** p = 0x10000;
register void* sp asm("sp") = *p;
__asm__ __volatile__("" : : "r" (sp) : "memory");

Обратите внимание, что связываться с sp опасно, поэтому убедитесь, что вы знаете, что делаете.

Для загрузки pc вам действительно потребуется использовать mov, например:

void** p = 0x10000;
__asm__ __volatile__("mov pc, %0" : : "r" (*p) : "memory");
__builtin_unreachable();
...