Встроенная сборка
Введение
Этот документ посвящен встроенной сборке на языке Wave. Встроенная сборка - это одна из возможностей, предоставляемых Wave, представляющая собой синтаксис экстримального уровня, который позволяет поддерживать удобство высокоуровневых языков, обеспечивая при этом прямой доступ к низкоуровневому управлению оборудованием.
То есть, она позволяет выполнять такие операции, как манипуляции с регистрами, прямой доступ к памяти, выполнение специальных команд, которые сложно реализовать с помощью обычного кода Wave, и используется при необходимости оптимизации производительности или аппаратно-зависимых задач.
Основной синтаксис
asm {
    "ассемблерная команда"          // реальный ассемблерный код (одна команда на строку)
    ...
    in("регистр") значение       // сопоставление с входным регистром
    out("регистр") переменная    // сопоставление с выходным регистром
}
Элементы синтаксиса
- 
Ассемблерная команда
- Они пишутся в виде строки 
"..."и представляют собой низкоуровневые ассемблерные команды, выполняемые на реальном процессоре. - Можно писать на нескольких строках, по одной команде на каждую строку.
 - Пример:
"mov rax, 1"
"syscall" 
 - Они пишутся в виде строки 
 - 
in("регистр") значение- Загружает значение переменной (или выражения) в указанный регистр.
 - Пример:
-> Загружает значение переменной
in("rdi") ssв регистрrdi, который является первым регистром аргументов syscall в соглашении x86-64. 
 - 
out("регистр") переменная- Забирает значение из указанного регистра в переменную Wave.
 - Пример:
-> Сохраняет в переменной
out("rax") retretзначение регистра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проверяются во время компиляции, но достоверность самих команд не гарантируется.