שְׁאֵלָה:
הוראות NOP
Cream Cracker
2013-06-20 20:47:40 UTC
view on stackexchange narkive permalink

למדתי לאחרונה ש nop הוראה היא למעשה xchg eax, eax ... מה שהיא עושה זה בעצם להחליף eax עם עצמו.

ככל שמעבד המעבד, האם ההחלפה אכן מתרחשת?

[בשלב מסוים זה עשה זאת, וזה כבר לא היה NOP] (http://www.pagetable.com/?p=6).
@DCoder למה אתה מתכוון?
קרא את הדף אליו קישרתי. היה באג בחלק ממעבדי ה- x64 של AMD שבהם למעשה בוצעה 'xchg EAX, EAX' ... [רוב הוראות 32 סיביות במצב x64 אפסו את 332 הסיביות העליונות של אופראנדים שלהן] (http://stackoverflow.com/questions / 11177137 / מדוע לעשות הכי הרבה x64 הוראות-אפס-החלק העליון-של-רישום של 32 סיביות), וגם הוראה זו עשתה זאת.
@DCoder מה לגבי 32 ביט. האם זה עדיין רלוונטי?
אין לזה שום השפעה על 32 סיביות.
שתיים תשובות:
PSS
2013-06-20 21:09:02 UTC
view on stackexchange narkive permalink

ישנן מספר הוראות, בהן ניתן להשתמש בהתאם למהדר. xchg eax, eax הוא קוד בתים 90. זו הוראה חוקית, שתופסת מחזור עיבוד יחיד. בנוסף, ישנן מספר הוראות נוספות, אשר יכולות לשמש במקום xchg eax, eax :

  lea eax, [eax + 0x00] קוד בתים 8D 40 00mov eax, קוד בתים eax 89 C0  

מכיוון שכל ההוראות האלה באורך שונה, המהדר בוחר באחת הגרסאות המתאימות ביותר בהתאם לדרישות היישור.

לגבי בחירות המהדרים, כמה מצביעים:

אבל הם כנראה פחות "כמו NOP" מאשר ה- xchg. חוץ מזה, ה- NOP המתועד מרובה-בתים הוא הסט "0f 1f / 0".
ההוראה היחידה האחרת 'nop' היא '0F 1F / 0' שהיא 'NOP r / m16' ו- 'NOP r / m32' במעבדים נתמכים. זה עשוי להימשך בין 3 ל -9 בתים ב- x86-64, לפי [Intel doc] (https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia -32-אדריכלות-תוכנה-מפתח-הוראות-סט-עזר-הוראות-325383.pdf) (עמוד 4-163). אז למרות שאתה יכול להשתמש ב- 'mov eax, eax' ואחרים כחלופה, יש לה חסרון לעומת 'nop' אמיתי בכך שהיא חוסמת את צינור המעבד וחסרת אופטימיזציות חומרה אחרות המיושמות בהוראת 'nop'.
David Hoelzer
2013-07-14 03:09:40 UTC
view on stackexchange narkive permalink

התשובה הקצרה היא "כן". למעשה, אם תתנסו ביצירת קודי אופ בשפת מכונה באופן ישיר, תגלו שיש מגוון שלם של פעולות שהן למעשה NOPs, שלכולן נדרש מחזור מעבד יחיד לביצוע.

בזמן שהם לא "מתועד" מבחינה טכנית, תמצא את זה קרוב מאוד ל- 0x90,

  • XCHG EAX, EAX
  • XCHG EBX, EBX
  • XCHG ECX, ECX
  • XCHG EDX, EDX
אני לא חושב שזה נכון. אני חושב שה- EAX שאינו לוקח יותר מחזורים (3 ולא 1) ואני חושב שכל גרסאות ה- XCHG למעשה 0 בסדר הגבוה יותר של 32 ביט על x86_64. https://stackoverflow.com/a/25053039/124486


שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 3.0 עליו הוא מופץ.
Loading...