수색…


통사론

  • #! [feature (asm)] // asm을 활성화하십시오! 매크로 기능 게이트
  • asm! (<template> : <output> : <input> : <clobbers> : <options>) // 제공된 템플릿 (예 : "NOP", "ADD % eax, 4")을 지정된 옵션으로 내 보냅니다.

asm! 매크로

인라인 어셈블리는 야간 버전의 Rust에서 안정화 될 때까지만 지원됩니다. asm! 사용하려면 asm! 매크로를 사용하려면 주 파일 ( 기능 게이트 ) 상단에서 다음 기능 속성을 사용하십시오.

 #![feature(asm)]

그런 다음 asm! 사용하십시오 asm! unsafe 블록의 매크로 :

fn do_nothing() {
    unsafe {
        asm!("NOP");
    }

    // asm!("NOP"); 
    // That would be invalid here, because we are no longer in an 
    // unsafe block.
}

조건부로 인라인 어셈블리 컴파일

조건부 컴파일을 사용하면 코드가 의도 한 명령 집합 (예 : x86 )에만 컴파일되도록합니다. 그렇지 않으면 프로그램이 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.
}

입력 및 출력

#![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);
    }
}

LLVM의 제약 코드는 여기 에서 찾을 수 있지만 이것은 rustc 컴파일러에서 사용하는 LLVM의 버전에 따라 다를 수 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow