Линейная сборка

Описывает контракт командной строки блока 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 за небольшой функцией.

Поведение и переносимость встроенного ассемблера не гарантируются только типом языка.

Обучение и примеры

Практика по полной программе · Стандартная библиотека