You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 15:06:11