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
相关产品推荐
相关产品推荐

