如何使用内联汇编将给定地址写入寄存器

时间:2018-11-12 10:04:15

标签: c arm inline-assembly

我有以下声明:

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");

与PC相同

谢谢。

1 个答案:

答案 0 :(得分:0)

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();