asm! makrosu
- Rust kursu
- Uzman
- Ders 25/46
- 4 dk
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
fn main() {
// buraya yaz
}Örnek çözüm
#[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
unsafe {
std::arch::____!("add {0}, 4", inout(reg) x);
}
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ı |