Rust
インラインアセンブリ
サーチ…
構文
- #![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