פתרון סביבת ריצה מינימלית¶
החליפו בדוגמה המלאה את חתימת הפונקציה ואת operand של rdi בשורות הבאות. יתר ה־operands וה־clobbers נשארים כפי שהיו.
fn write_once(fd: usize, bytes: &[u8]) -> isize {
let result: isize;
unsafe {
asm!("syscall", inlateout("rax") 1usize => result,
in("rdi") fd, in("rsi") bytes.as_ptr(), in("rdx") bytes.len(),
lateout("rcx") _, lateout("r11") _, options(nostack));
}
result
}
עדכנו את הקריאה ל־write_once(2, message) ואת קוד ההצלחה ל־7. הפקודות הבאות משאירות את ההודעה על המסוף ומציגות את קוד הסיום שנשמר מיד לאחר התוכנית.
ההבטחה nomem הייתה מאפשרת למהדר להסיק שהאסמבלי אינו קורא את הבאפר, אף שהקרנל קורא אותו בפועל. ההבדל הארכיטקטוני כולל את הוראת המעבר, מספרי הקריאות, הרגיסטרים והחוזה לגבי ערכים שנדרסים. התוצאה השלילית דורשת פענוח שגיאה, בעוד שתוצאה לא שלילית עשויה להיות התקדמות חלקית שאינה מספיקה להשלמת הפעולה.