Линейная сборка
Описывает контракт командной строки блока asm, операндов in/out и clobber.
Wave Foundation
asm блок
asm — это синтаксис низкого уровня для непосредственной вставки инструкций целевой архитектуры.
fun read_value() -> i64 {
var result: i64 = 0;
asm {
"mov rax, 123"
out("rax") result
}
return result;
}
Строковые литералы внутри блока передаются как список инструкций ассемблера.
ввод и вывод
var result: i64 = 0;
asm {
"mov rax, rdi"
in("rdi") 123
out("rax") result
}
in("reg") expressionсвязывает значение Wave с входным операндом.out("reg") targetзаписывает выходное значение в назначаемую цель Wave.- Имена регистров могут быть записаны в виде строк или идентификаторов.
Входные операнды могут включать переменные, целочисленные/строковые литералы, &identifier, deref identifier и отрицательные числа.
clobber
Если блок изменяет состояние регистра или памяти, отличное от явного вывода, это записывается в clobber(...).
asm {
"nop"
clobber("rax", "rcx", "memory")
}
Проверяйте при использовании
- Синтаксис инструкций должен соответствовать целевой архитектуре и контракту встроенной сборки LLVM.
- Не уничтожайте произвольно регистры, которые должны быть сохранены в соответствии с соглашением о вызовах.
- Для блоков, которые читают или записывают память, объявите clobber, включая
memory. - Если возможно, изолируйте специфичную для архитектуры asm за небольшой функцией.
Поведение и переносимость встроенного ассемблера не гарантируются только типом языка.