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

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

电脑端同样

谢谢。

最佳答案

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

关于c - 如何使用内联汇编将给定地址写入寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53259825/

相关文章:

c++ - 如何将此程序集时间戳函数转换为 C++?

c - 解析具有多个分隔符的字符串

c - 在 64 位处理器中读取 32 位指针的结构

delphi - 如何在内联汇编中访问delphi开放数组参数

c - Overeager struct packing warnings with `__attribute__((packed))` ?

linux - 有什么方法可以在 Linux 上将二进制文件从 x86 重新编译到 ARM?

c - 内联汇编未正确解析

c - mount() 上的自动检测文件系统

c - C 中的输入限制

c - 如何根据用户输入的行和列在c中制作实心和空心正方形