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

How do I use a constant in Rust's inline assembly macro?

我正在将一些遗留汇编代码移植到 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

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

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

正确的约束取决于架构;在 RISC CPU 上,并非所有常量都可以表示为立即值。因此,您可能不得不改用寄存器约束,并让 LLVM 在那里具体化常量。