수색…
통사론
- #! [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