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