Rust
Assemblaggio in linea
Ricerca…
Sintassi
- #! [feature (asm)] // Abilita il comando asm! porta caratteristica macro
- asm! (<template>: <output>: <input>: <clobbers>: <opzioni>) // Emette il modello di assieme fornito (ad esempio "NOP", "ADD% eax, 4") con le opzioni fornite.
Asm! macro
L'assemblaggio in linea sarà supportato solo nelle versioni notturne di Rust finché non sarà stabilizzato . Per abilitare l'uso di asm!
macro, utilizzare il seguente attributo feature nella parte superiore del file principale (un gate di funzionalità ):
#![feature(asm)]
Quindi usa l' asm!
macro in qualsiasi blocco unsafe
:
fn do_nothing() {
unsafe {
asm!("NOP");
}
// asm!("NOP");
// That would be invalid here, because we are no longer in an
// unsafe block.
}
Assemblaggio in linea compilato in modo condizionale
Utilizzare la compilazione condizionale per assicurarsi che il codice compili solo per il set di istruzioni previsto (come x86
). Altrimenti il codice potrebbe diventare non valido se il programma è compilato per un'altra architettura, come i processori ARM.
#![feature(asm)]
// Any valid x86 code is valid for x86_64 as well. Be careful
// not to write x86_64 only code while including x86 in the
// compilation targets!
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
fn do_nothing() {
unsafe {
asm!("NOP");
}
}
#[cfg(not(any(target_arch = "x86", target_arch = "x86_64"))]
fn do_nothing() {
// This is an alternative implementation that doesn't use any asm!
// calls. Therefore, it should be safe to use as a fallback.
}
Ingressi e uscite
#![feature(asm)]
#[cfg(any(target_arch="x86", target_arch="x86_64"))]
fn subtract(first: i32, second: i32) {
unsafe {
// Output values must either be unassigned (let result;) or mutable.
let result: i32;
// Each value that you pass in will be in a certain register, which
// can be accessed with $0, $1, $2...
//
// The registers are assigned from left to right, so $0 is the
// register containing 'result', $1 is the register containing
// 'first' and $2 is the register containing 'second'.
//
// Rust uses AT&T syntax by default, so the format is:
// SUB source, destination
// which is equivalent to:
// destination -= source;
//
// Because we want to subtract the first from the second,
// we use the 0 constraint on 'first' to use the same
// register as the output.
// Therefore, we're doing:
// SUB second, first
// and getting the value of 'first'
asm!("SUB $2, $0" : "=r"(result) : "0"(first), "r"(second));
println!("{}", result);
}
}
I codici di vincoli di LLVM possono essere trovati qui , ma questo può variare a seconda della versione di LLVM utilizzata dal tuo compilatore rustc
.
Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow