跳到主要内容

内联汇编

介绍

本文档介绍Wave语言的内联汇编。 内联汇编是Wave提供的功能之一,它是一种极端语法,保持高级语言的便利性,同时能直接访问低级硬件控制。

即,可以实现一般Wave代码难以处理的寄存器操作、直接内存访问、特殊指令执行等,当需要性能优化或硬件依赖任务时使用。


基本语法

asm {
"汇编指令" // 实际汇编代码 (每行一条指令)
...
in("寄存器") 值 // 输入寄存器映射
out("寄存器") 变量 // 输出寄存器映射
}

语法元素

  1. 汇编指令

    • "..."字符串形式编写,为实际在CPU上执行的低级汇编指令。
    • 可以写多行,每行写一个指令。
    • 例子:
      "mov rax, 1"
      "syscall"
  2. in("寄存器") 值

    • 将变量(或表达式)的值加载到指定寄存器。
    • 例子:
      in("rdi") s
      -> 将变量s的值放入x86-64规范中的第一个syscall参数寄存器rdi中。
  3. out("寄存器") 变量

    • 将指定寄存器的值取到Wave变量中。
    • 例子:
      out("rax") ret
      -> 将存有syscall返回值的rax寄存器中的值存储到变量ret中。

简单例子

fun main() {
var msg_ptr: ptr<i8> = "Hello from syscall!\n";
var ret_val: i64;

asm {
"mov rax, 1"
"syscall"
in("rdi") 1
in("rsi") msg_ptr
in("rdx") 20
out("rax") ret_val
}
}

注意事项

  • 内联汇编绕过了Wave的类型安全,因此在使用错误命令时,程序可能会异常终止或出现未定义行为。
  • in, out 映射在编译时验证,但不保证指令本身的有效性。