אסמבלי x86/זיכרון/שיטות מיעון: הבדלים בין גרסאות בדף

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי
תוכן שנמחק תוכן שנוסף
Crazy Ivan (שיחה | תרומות)
Ergo12 (שיחה | תרומות)
שורה 50: שורה 50:
<div style="text-align:left; direction:ltr;"><pre>disp [REG1][REG2]</pre></div>
<div style="text-align:left; direction:ltr;"><pre>disp [REG1][REG2]</pre></div>
<br />
<br />
כאשר REG1 יכול להיות BX או BP בלבד.<br />
כאשר REG1 יכול להיות BX או BP בלבד, <br />
ו REG2 יכול להיות SI או DI בלבד.
ו REG2 יכול להיות SI או DI בלבד.
<br />הדוגמאות הבאות שוות ערך:
<br />הדוגמאות הבאות שוות ערך:

גרסה מ־12:28, 29 במרץ 2013

אסמבלי x86











כמו שכבר הזכרנו, כברירת מחדל שימוש בזכרון מתבצע במקטע הנתונים. אך ניתן לאלץ את המהדר להשתמש במקטע אחר לפי התבנית הבאה:

SEGMENT:[MEMORY_LOCATION]

לדוגמא, הפקודה:

MOV   AX, WORD PTR ES:[0FF2CH]

תכניס לתוך אוגר AX את תוכן הכתובת 0FFC2H יחסית למקטע הנתונים. שימו לב לשימוש באופרטור WORD PTR, ללא אופרטור זה לא יהיה למהדר אפשרות לדעת אם התכוונו לשלוף מהזכרון בית או מילה.

מיעון אוגר

העתקת ערך מאוגר מקור לאוגר יעד. לדוגמא:

   MOV    AX, BX

מיעון מידי

העתקת ערך מיידי לתוך אוגר או משתנה. לדוגמא:

   MOV    AX, 12

מיעון ישיר

העתקת ערך משתנה לתוך אוגר. לדוגמא:

   MOV    AX, Var

מיעון עקיף

העתקת ערך מהזכרון לתוך אוגר. לדוגמא:

   MOV    AX, [BX]

הדוגמאות הבאות שוות ערך:

   MOV    AX, [BX+8]
   MOV    AX, [BX]8
   MOV    AX, 8[BX]

הדוגמאות הבאות שוות ערך:

   MOV    AX, [DS]:[BX]
   MOV    AX, DS:[BX]
   MOV    AX, [BX]
   MOV    AX, DS+BX

מיעון אינדקס

העתקת איבר במערך לתוך אוגר. הדוגמאות הבאות שוות ערך:

   MOV    AX, Array[BX]
   MOV    AX, [Array+BX]
   MOV    AX, [BX]+Array

הדוגמא הבאה מעתיקה לתוך AX את התוכן שנמצא בכתובת של המשתנה Var ועוד 1: (זהה ל- Var1[1]z)

   MOV    AX, Var+1

הדוגמאות הבאות שוות ערך:

    MOV    DL, Array[SI+1]
    MOV    DL, Array+1[SI]

מיעון אינדקס כפול

מיעון אפקטיבי המורכב משני אוגרים. תחביר:

disp [REG1+REG2]

או:

disp [REG1][REG2]


כאשר REG1 יכול להיות BX או BP בלבד,
ו REG2 יכול להיות SI או DI בלבד.
הדוגמאות הבאות שוות ערך:

    MOV    DL, Array[BX+SI]
    MOV    DL, Array[BX][SI]


הדוגמאות הבאות שוות ערך:

    MOV    DL, Array[BX+SI+4]
    MOV    DL, Array[BX][SI]4

הדוגמא הבאה אינה חוקית:

    MOV    DL, Array[SI+DI]

שימו לב: לא ניתן לבצע העתקה מזכרון לזכרון. הדוגמא הבאה אינה חוקית:

   MOV    [BX], Var

כמו כן, לא ניתן לבצע מיעון על מקטע בלבד. הדוגמא הבאה אינה חוקית:

   DEC    [DS]