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") s
s
in 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") ret
rax
-Registers, in dem der Rückgabewert dessyscall
gespeichert 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.