【问题标题】:Inline ARM assembly instructions内联 ARM 汇编指令
【发布时间】: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


【解决方案1】:

r0 是 Aarch32 模式下的有效寄存器名称。 如果你在 Aarch64 模式下运行 Rust,你应该使用 ldr x0, =0x3f200000ldr w0, =0x3f200000

【讨论】: