我正在将一些旧的汇编代码移植到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
答案 0 :(得分:2)
您需要使用适当的约束传递常量,如下所示:
unsafe { asm!("ldr x0, =${0:c}" : : "i" (HCR_VALUE) : "x0"); }
正确的约束取决于体系结构;在RISC CPU上,并非所有常量都可以表示为立即数。因此,您可能不得不改用寄存器约束,并使LLVM在此实现该常量。