אסמבלי x86/זיכרון/שיטות מיעון
אסמבלי 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]