Montaje en línea
Describe el contrato de la cadena de comando del bloque asm, los operandos in/out y clobber.
Wave Foundation
asm bloque
asm es una sintaxis de bajo nivel para insertar directamente instrucciones de la arquitectura de destino.
fun read_value() -> i64 {
var result: i64 = 0;
asm {
"mov rax, 123"
out("rax") result
}
return result;
}
Los literales de cadena dentro de un bloque se pasan como una lista de instrucciones de ensamblaje.
entrada y salida
var result: i64 = 0;
asm {
"mov rax, rdi"
in("rdi") 123
out("rax") result
}
in("reg") expressionconecta el valor Wave al operando de entrada.out("reg") targetescribe el valor de salida en el destino Wave asignable.- Los nombres de los registros se pueden escribir como cadenas o identificadores.
Los operandos de entrada pueden incluir variables, literales enteros/de cadena, &identifier, deref identifier y números negativos.
clobber
Si un bloque cambia un estado de registro o memoria que no sea una salida explícita, se registra en clobber(...).
asm {
"nop"
clobber("rax", "rcx", "memory")
}
Comprobar cuando se utiliza
- La sintaxis de la instrucción debe coincidir con la arquitectura de destino y el contrato de ensamblaje en línea LLVM.
- No destruya arbitrariamente los registros que deben conservarse según la convención de llamada.
- Para bloques que leen o escriben memoria, declare clobber, incluido
memory. - Si es posible, aísle el asm específico de la arquitectura detrás de una función pequeña.
El comportamiento y la portabilidad del ensamblador en línea no están garantizados únicamente por el tipo de idioma.