למדתי לאחרונה ש nop
הוראה היא למעשה xchg eax, eax
... מה שהיא עושה זה בעצם להחליף eax
עם עצמו.
ככל שמעבד המעבד, האם ההחלפה אכן מתרחשת?
למדתי לאחרונה ש nop
הוראה היא למעשה xchg eax, eax
... מה שהיא עושה זה בעצם להחליף eax
עם עצמו.
ככל שמעבד המעבד, האם ההחלפה אכן מתרחשת?
ישנן מספר הוראות, בהן ניתן להשתמש בהתאם למהדר. xchg eax, eax
הוא קוד בתים 90. זו הוראה חוקית, שתופסת מחזור עיבוד יחיד. בנוסף, ישנן מספר הוראות נוספות, אשר יכולות לשמש במקום xchg eax, eax
:
lea eax, [eax + 0x00] קוד בתים 8D 40 00mov eax, קוד בתים eax 89 C0
מכיוון שכל ההוראות האלה באורך שונה, המהדר בוחר באחת הגרסאות המתאימות ביותר בהתאם לדרישות היישור.
לגבי בחירות המהדרים, כמה מצביעים:
GAS (GNU Assembler, המשמש על ידי GCC) פעולות x86 NOP ניתן למצוא בפונקציה i386_align_code ()
באופן דומה, עבור LLVM הוא נמצא ב X86AsmBackend :: writeNopData ()
התשובה הקצרה היא "כן". למעשה, אם תתנסו ביצירת קודי אופ בשפת מכונה באופן ישיר, תגלו שיש מגוון שלם של פעולות שהן למעשה NOPs, שלכולן נדרש מחזור מעבד יחיד לביצוע.
בזמן שהם לא "מתועד" מבחינה טכנית, תמצא את זה קרוב מאוד ל- 0x90,
XCHG EAX, EAX
XCHG EBX, EBX
XCHG ECX, ECX
XCHG EDX, EDX