首页 > 解决方案 > 什么是正确的 Rust 内联汇编格式?

问题描述

如何让新的内联汇编格式与 rust 一起使用?我想要一个调用 outb 的函数。

unsafe fn outb(value: u8, port: u16) {
    asm!(
        "outb {0}, {1}",
        in(reg_byte) value,
        in(reg_abcd) port,
     );
 }

这是几乎生成代码的唯一版本。有错误消息是:

error: invalid operand for instruction

   |
29 |         "outb {0}, {1}",
   |          ^
   |
note: instantiated into assembly here
--> <inline asm>:2:2
   |
2  |     outb dil, rax
   |     ^

标签: rust

解决方案


首先,您使用的是 AT&T 语法,但新的asm!默认值是 Intel 的。您仍然可以使用 AT&T,但必须添加options(att_syntax).

然后,看看如何使用该指令。您需要解决OUT DX, ALoutb %al, %dx在 AT&T 中),不允许使用其他这些大小的寄存器。

所以你根本不能使用注册类:

    asm!(
        "outb %al, %dx",
        in("dx") port,
        in("al") value,
        options(att_syntax)
     );

或者在英特尔语法中:

    asm!(
        "out dx, al",
        in("dx") port,
        in("al") value,
     );

推荐阅读