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

Rust/LLVM全局汇编中jmp %rax语法报错,GAS可正常兼容

Rust中LLVM内置汇编器与GAS的AT&T语法差异:jmp指令的问题

问题现象

Rust使用的LLVM内置汇编器对AT&T语法的要求比GNU as(GAS)更严格:

  • 编写jmp %rax这类间接跳转指令时,会触发报错:mnemonic without a size suffix
  • 即使添加尺寸后缀改为jmpq %rax,依然无法正常编译

最小复现代码:

core::arch::global_asm!(
        "foo:",
        "mov $ffffffff88000000, %rax",
        "jmp %rax"
    , options(att_syntax));

fn main() {
}

对比GAS行为:用GAS编译相同逻辑的汇编代码后,通过objdump查看会得到jmpq *%rax指令——GAS会自动补全间接跳转所需的*标记,但LLVM汇编器不允许这种省略。

解决方案

LLVM的AT&T语法要求间接跳转必须显式指定*,同时要确保尺寸后缀与寄存器宽度匹配。修改后的代码如下:

core::arch::global_asm!(
        "foo:",
        "mov $ffffffff88000000, %rax",
        "jmpq *%rax"
    , options(att_syntax));

fn main() {
}

原因说明

LLVM汇编器对指令语法的严谨性要求更高:

  • GAS会自动推断间接跳转的*标记,但LLVM需要开发者显式写出,以此明确区分直接跳转(如jmp foo)和间接跳转(如jmpq *%rax)
  • 尺寸后缀q对应64位寄存器rax,必须明确指定以匹配寄存器宽度,避免“缺少尺寸后缀”的报错

内容的提问来源于stack exchange,提问作者phip1611

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:15:42