Inline-Assembly
Einführung
Dieses Dokument behandelt Inline-Assembly in der Wave-Sprache. Inline-Assembly ist eine der Funktionen, die Wave bietet; es ermöglicht die Beibehaltung des Komforts von Hochsprachen und gleichzeitig den direkten Zugriff auf die Steuerung von Low-Level-Hardware mit einer extremen Syntax.
Das bedeutet, dass es Registermanipulationen, direkten Speicherzugriff und die Ausführung spezieller Befehle ermöglicht, die mit normalem Wave-Code schwer zu handhaben sind. Es wird genutzt, wenn Leistungsoptimierung oder hardwareabhängige Arbeiten erforderlich sind.
Grundsyntax
asm {
    "Assembly-Befehl"          // Tatsächlicher Assembly-Code (ein Befehl pro Zeile)
    ...
    in("Register") Wert         // Eingangsregisterzuordnung
    out("Register") Variable    // Ausgangsregisterzuordnung
}
Syntaxelemente
- 
Assembly-Befehle
- Wird in Form eines 
"..."-Strings geschrieben und ist ein Low-Level-Assembly-Befehl, der auf der tatsächlichen CPU ausgeführt wird. - Es können mehrere Zeilen geschrieben werden, wobei jede Zeile einen Befehl enthält.
 - Beispiel:
"mov rax, 1"
"syscall" 
 - Wird in Form eines 
 - 
in("Register") Wert- Lädt den Wert einer Variable (oder eines Ausdrucks) in das angegebene Register.
 - Beispiel:
-> Setzt den Wert der Variable
in("rdi") ssin dasrdi-Register, das gemäß der x86-64-Konvention das erste Argumentregister für syscalls ist. 
 - 
out("Register") Variable- Holt den Wert des angegebenen Registers in eine Wave-Variable.
 - Beispiel:
-> Speichert den Wert des
out("rax") retrax-Registers, in dem der Rückgabewert dessyscallgespeichert ist, in der Variableret. 
 
Einfaches Beispiel
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
    }
}
Vorsichtsmaßnahmen
- Inline-Assembly umgeht die Typensicherheit von Wave und kann bei falscher Nutzung zur abnormalen Beendigung von Programmen oder undefiniertem Verhalten führen.
 in,out-Mappings werden zur Kompilierzeit überprüft, jedoch wird die Gültigkeit der Instruktionen selbst nicht gewährleistet.