Rust内联汇编模板语法

3

我在test.s中有以下代码:

call $8 + $8

运行nasm test.s编译成功。我期望下面等效的Rust代码也能够编译成功,但是它没有。

test.rs中:

#![feature(asm)]
fn main() {
    unsafe {
        asm! (
            "call $0 + $0"
            :
            : "i" (8)
            : "memory"
            : "volatile"
        )
    }
}

rustc test.rs 的输出结果:

test.rs:4:9: 10:11 error: <inline asm>:1:12: error: invalid token in expression
        call $8 + $8
                  ^

你到底想做什么?还是只是在试验吗? - Alexandros
1个回答

6

这是对我有效的方法:

#![feature(asm)]
fn main() {
    unsafe {
        asm!( "call ${0:c} + ${0:c}"
            :
            : "i"(8)
            : "memory"
            : "volatile"
        )
    }
}

这里是LLVM参考文献中与汇编模板参数修改器相关的文档。通过查看objdump的输出,我们可以验证我们的内联汇编已被发射:
0000000000005190 <_ZN4main20hc3048743ecd04f53eaaE>:
    5190:   e8 7b ae ff ff          callq  10 <_ZN10sys_common11thread_info11THREAD_INFO5__KEY20h20efb688859d2c0dRhsE+0x10>
    5195:   c3                      retq   
    5196:   66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
    519d:   00 00 00 

更新:以下是从内联汇编直接调用函数的示例:

#![feature(asm)]

fn called_even_if_mangled() {
    println!("Just a regular function minding its own business");
}

fn main() {
    unsafe {
        asm!( "call ${0:c}"
            :
            : "i"(called_even_if_mangled)
            : "memory"
            : "volatile", "alignstack"
            // Omit "alignstack" and you'll get a segfault because of a
            // misaligned SSE load on some initialization code regarding
            // stdin.
        )
    }
}

但是你绝对不能这样做,除非你有非常好的、令人信服的理由(例如,因为你正在编写JIT)。在我意识到我还必须在选项部分中加上alignstack之前,我不得不花一个小时来调试一个神秘的段错误。

你已经被警告了。


谢谢!有没有想法能否使用符号名称来表示输入/输出?我找不到任何关于这个主题的信息,但是LLVM似乎支持它 - Carl Patenaude Poulin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接