assembly Rust/LLVM中的全局装配:不允许使用“jmp %rax”,但语法在GAS中是正确的(无大小后缀的助记符)[duplicate]

u1ehiz5o  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(142)

此问题在此处已有答案

What does an asterisk * before an address mean in x86-64 AT&T assembly?(7个答案)
昨天关门了。
我注意到,与 GNU as(GAS)不同,Rust使用的LLVM内部汇编程序不允许使用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编译这个汇编代码时,objdump显示为jmpq *%rax

wz1wpwve

wz1wpwve1#

GAS和LLVM的内部汇编程序有细微的区别,GAS似乎允许更多的“马虎”,而LLVM更精确。
我不知道这是什么意思,但是将该行更改为jmp *%rax(带 *)就解决了这个问题。

相关问题