Mac/aarch64架构下Rust inline asm!的mov指令编译报错求助
Mac/aarch64环境下Rust内联汇编编译错误修复
问题描述
在Mac/aarch64(Apple Silicon)环境下运行以下Rust内联汇编代码时出现编译错误:
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] | ^
问题原因
这是ARM64(aarch64)架构的指令规则限制导致的。ARM64的mov指令仅支持寄存器之间或立即数到寄存器的赋值,不支持直接从内存地址加载值到通用寄存器;这类内存加载操作需要使用ldr(Load Register)指令完成。原代码采用了x86架构的mov内存访问语法,在ARM64架构下无法兼容。
修复方案
针对aarch64架构的修复
将内联汇编中的mov指令替换为ARM64对应的ldr指令即可:
fn dereference(ptr: *const usize) -> usize { let mut res: usize; unsafe { asm!("ldr {0}, [{1}]", out(reg) res, in(reg) ptr) }; res }
跨架构兼容方案
如果需要代码同时支持x86_64和aarch64架构,可以使用Rust的条件编译区分不同架构的指令:
fn dereference(ptr: *const usize) -> usize { let mut res: usize; unsafe { #[cfg(target_arch = "x86_64")] asm!("mov {0}, [{1}]", out(reg) res, in(reg) ptr); #[cfg(target_arch = "aarch64")] asm!("ldr {0}, [{1}]", out(reg) res, in(reg) ptr); } res }
内容的提问来源于stack exchange,提问作者Tatiana Racheva
相关产品推荐
相关产品推荐

