CodeBlanks Logo Icon CodeBlanks

asm! makrosu

core::arch::asm! ile assembly yazmayı öğrenirsin.

asm! makrosu

core::arch::asm!, Rust kodunun içine doğrudan işlemci talimatları yazmayı sağlar (Rust 1.59'dan beri kararlı). Yalnızca unsafe içinde kullanılabilir, çünkü derleyici talimatların ne yaptığını denetleyemez. Varsayılan sözdizimi x86'da Intel'dir:

use std::arch::asm;

let mut x: u64 = 3;
unsafe {
    asm!("add {0}, 4", inout(reg) x);
}
// x == 7

{0} bir yer tutucudur; derleyici oraya seçtiği bir yazmacı koyar. Kod platforma özgüdür; bu yüzden genellikle #[cfg(target_arch = "x86_64")] ile korunur.

Taşınabilirlik

Assembly bir mimariye bağlıdır. Kodu her platformda derlenebilir tutmak için her mimariye ayrı bir uygulama ya da genel bir yedek yazılır:

#[cfg(target_arch = "x86_64")]
fn dort_ekle(mut x: u64) -> u64 {
    unsafe { std::arch::asm!("add {0}, 4", inout(reg) x) };
    x
}

#[cfg(not(target_arch = "x86_64"))]
fn dort_ekle(x: u64) -> u64 {
    x + 4
}

Desteklenen mimariler: x86/x86-64, ARM/AArch64, RISC-V, LoongArch ve birkaç diğeri.

Uygulama İlk assembly

Yukarıdaki dort_ekle fonksiyonunu x86-64 için asm! ile, diğer mimariler için düz Rust ile yaz. dort_ekle(3) sonucunu yazdır.

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
#[cfg(target_arch = "x86_64")]
fn dort_ekle(mut x: u64) -> u64 {
    // SAFETY: yalnızca x'in yazmacını değiştirir.
    unsafe { std::arch::asm!("add {0}, 4", inout(reg) x) };
    x
}

#[cfg(not(target_arch = "x86_64"))]
fn dort_ekle(x: u64) -> u64 {
    x + 4
}

fn main() {
    println!("{}", dort_ekle(3));
}

Beklenen çıktı

7

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Inline assembly ne zaman haklı bir seçimdir?

  • Okunabilirlik için
  • Hiçbir zaman
  • Rust'ın ifade edemediği özel bir talimat ya da donanım erişimi gerektiğinde Doğru cevap
  • Kodu hızlandırmak için her zaman

Açıklama: Derleyici çoğu zaman elle yazılan assembly kadar iyi kod üretir; önce std::arch intrinsics ve ölçüm denenir.

2 Assembly makrosu

Soru
unsafe {
    std::arch::____!("add {0}, 4", inout(reg) x);
}
Cevap
unsafe {
    std::arch::asm!("add {0}, 4", inout(reg) x);
}

Açıklama: asm! satır içi assembly yazmak içindir.

3 Öğe ve anlamı

Kavram Anlamı
asm!(..) Satır içi assembly
{0} Yer tutucu
inout(reg) x Girdi ve çıktı
#[cfg(target_arch)] Mimari koruması

Uzman bölümündeki tüm dersler