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

kmbjn2e3  于 2023-01-17  发布在  其他
关注(0)|答案(2)|浏览(156)

我正在将一些旧的汇编代码移植到Rust,我需要通过asm!宏调用它。然而,汇编代码依赖于存储在C头文件中的一些常量。我希望保持类似,在Rust中定义常量,并在asm宏中拥有常量的名称。
传统C标头:

#define HCR_VALUE 0xffff0000

旧版ASM文件:

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

rust eclipse 代码:
一个二个一个一个
构建应用程序时会出现链接器错误:

lld-link: error: undefined symbol: HCR_VALUE
gg0vcinb

gg0vcinb1#

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

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

正确的约束取决于体系结构;在RISCCPU上,不是所有的常量都可以表示为立即数。2所以你可能不得不使用寄存器约束,并让LLVM在那里具体化常量。

vhmi4jdf

vhmi4jdf2#

当前的答案asm样式已经过时了,取而代之的是一种更像rustacean的语法。然而,汇编上的常量仍然隐藏在一个特性标志后面,并且如果我没记错的话,只在nightly中使用。只需在主文件的顶部添加#![feature(asm_const)]就可以使用这个惊人的特性。

pub const HCR_VALUE: u32 = 0xffff0000;
// just assume we are in an unsafe block
asm!("ldr x0, {hcr}", hcr = const HCR_VALUE);

更多信息请参见this issue
或者没有常数

asm!("ldr x0, {reg}", reg = in(reg) HCR_VALUE

这可能会产生与上面相同的编译结果。

相关问题