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