如何在Rust的内联汇编宏中使用常量?

时间:2018-09-28 17:10:51

标签: rust inline-assembly

我正在将一些旧的汇编代码移植到Rust,我需要通过asm!宏来调用它。但是,汇编代码取决于存储在C头文件中的某些常量。我想保持相似,在Rust中定义常量,并在asm宏中使用常量的名称。

旧版C标头:

#define HCR_VALUE 0xffff0000

旧版ASM文件:

.func
...
ldr    x0, =HCR_VALUE
...

锈迹代码:

pub const HCR_VALUE: u32 = 0xffff0000;
unsafe { asm!("ldr x0, HCR_VALUE":::"x0"); }

构建应用程序最终会出现链接器错误:

lld-link: error: undefined symbol: HCR_VALUE

1 个答案:

答案 0 :(得分:2)

您需要使用适当的约束传递常量,如下所示:

unsafe { asm!("ldr x0, =${0:c}" : : "i" (HCR_VALUE) : "x0"); }

正确的约束取决于体系结构;在RISC CPU上,并非所有常量都可以表示为立即数。因此,您可能不得不改用寄存器约束,并使LLVM在此实现该常量。