Rust:使用 asm 编译错误!("mov... 在 aarch64 上

问题描述 投票:0回答:1

我正在 Mac/aarch64 上运行书中的 代码示例,并收到编译错误。

fn dereference(ptr: *const usize) -> usize {
    let mut res: usize;
    unsafe { 
        asm!("mov {0}, [{1}]", out(reg) res, in(reg) ptr)
    };
    res
}

我得到:

error: expected compatible register or logical immediate
  --> src/main.rs:20:15
   |
20 |         asm!("mov {0}, [{1}]", out(reg) res, in(reg) ptr)
   |               ^
   |
note: instantiated into assembly here
  --> <inline asm>:1:10
   |
1  |     mov x8, [x0]
   |             ^

搜索了错误消息后,我相信架构与它有关,但我还没有弄清楚如何修复它。我正在查看 Rust inline assembly 文档,但由于该主题对我来说是全新的,因此我无法将无法编译的示例映射到我在文档中看到的内容。

rust inline-assembly arm64
1个回答
0
投票

当然,花了很多时间但直到我发布这个问题后,我才找到答案。

Arm64
装配中的模板应该是
"mov {0}, {1}"
,而不是
"mov {0}, [{1}]"

有什么帮助:

  1. 我决定从头开始,阅读 Rust By Examples 关于内联汇编的章节。我发现最简单的 add
     示例也无法为我编译。
  2. add
     上谷歌搜索 
    Arm64
     后,我发现了
    汇编备忘单,它表明 add
     的语法在此架构上与 
    x86/x86-64
     完全不同(3 个参数而不是 2 个)。
  3. 我更仔细地观察了
  4. mov
     指令的语法,发现了问题。
© www.soinside.com 2019 - 2024. All rights reserved.