如何在 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 在那里具体化常量。
我正在将一些遗留汇编代码移植到 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 在那里具体化常量。