Перейти к основному содержимому

Встроенная сборка

Введение

Этот документ посвящен встроенной сборке на языке Wave. Встроенная сборка - это одна из возможностей, предоставляемых Wave, представляющая собой синтаксис экстримального уровня, который позволяет поддерживать удобство высокоуровневых языков, обеспечивая при этом прямой доступ к низкоуровневому управлению оборудованием.

То есть, она позволяет выполнять такие операции, как манипуляции с регистрами, прямой доступ к памяти, выполнение специальных команд, которые сложно реализовать с помощью обычного кода Wave, и используется при необходимости оптимизации производительности или аппаратно-зависимых задач.


Основной синтаксис

asm {
"ассемблерная команда" // реальный ассемблерный код (одна команда на строку)
...
in("регистр") значение // сопоставление с входным регистром
out("регистр") переменная // сопоставление с выходным регистром
}

Элементы синтаксиса

  1. Ассемблерная команда

    • Они пишутся в виде строки "..." и представляют собой низкоуровневые ассемблерные команды, выполняемые на реальном процессоре.
    • Можно писать на нескольких строках, по одной команде на каждую строку.
    • Пример:
      "mov rax, 1"
      "syscall"
  2. in("регистр") значение

    • Загружает значение переменной (или выражения) в указанный регистр.
    • Пример:
      in("rdi") s
      -> Загружает значение переменной s в регистр rdi, который является первым регистром аргументов syscall в соглашении x86-64.
  3. out("регистр") переменная

    • Забирает значение из указанного регистра в переменную Wave.
    • Пример:
      out("rax") ret
      -> Сохраняет в переменной ret значение регистра rax, в котором хранится возвращаемое значение syscall.

Простой пример

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 проверяются во время компиляции, но достоверность самих команд не гарантируется.