【发布时间】:2023-03-10 13:51:01
【问题描述】:
我想在我的 rust 代码中运行一些 ARM 汇编指令,因为我的目标是树莓派。问题是 rust 抱怨以下内容:
unsafe {
asm!("ldr r0, =0x3f200000");
}
我收到error: Only valid when first operand is register。但是r0 是一个 ARM 寄存器 (?)。
此外,我不想使用原始地址,而是想使用常量,但我也无法让它工作,并且在阅读了rust documentation 之后,我仍然无法理解假定的语法。
【问题讨论】:
-
我不会说 Rust(或 aarch64),但看看文档,我想知道你是否可以做类似
let x: u64; unsafe { asm!("ldr {0}, =0x3f200000", out(reg) x); }的事情? -
谢谢!两种解决方案都有效,接受的答案和这个,但我想知道为什么这是有效的,并使用它在代码中插入常量而不是原始地址。编辑:我现在明白这段代码将地址
0x3f200000中的内容放在变量x 中正确吗? -
“插入常量” - 根据您提供的链接,我希望您可以执行
asm!("ldr {0}, ={number}", out(reg) x, number = const 0x3f200000);之类的操作。显然我还没有尝试过。 “此代码将地址 0x3f200000 中的内容放在变量 x 中正确吗?” - 那将是我的期望。同样,不是 aarch64 程序员。至于那个地址是什么?谷歌给了我this,其中有一些链接。如果您要读取 64 位,请确保存储在那里的内容长度为 64 位,否则您最终会读取垃圾。 -
我刚刚尝试了这个并且它有效,但我不喜欢我不能在代码中的其他任何地方使用该常量的事实,我想这就是它的工作原理。是的,我忘记了我需要阅读 u64,但是最后一条评论确实使用了代码设置的 u64 类型的变量。
标签: rust raspberry-pi arm