מבנה המחשב ושפות סף תרגול 2
הפקודה MOV מבנה הפקודה: MOV אופרנד מקור , אופרנד יעד העברת תוכן אופרנד המקור לאופרנד היעד. רק אופרנד היעד משנה את ערכו. אופרנד היעד יכול להיות אוגר או זיכרון. אופרנד המקור יכול להיות אוגר, זיכרון או קבוע. מגבלה: אופרנד היעד והמקור לא יכולים להיות שניהם זיכרון. אופרנד היעד והמקור צריכים להיות באותו גודל. בפקודה זו, אוגרי הסגמנט (CS,DS,SS,ES) יכולים להיות אופרנד המקור, וכולם חוץ מ CS יכולים להיות אופרנד היעד. אופרנד היעד והמקור לא יכולים להיות שניהם אוגרי סגמנט. אופרנד המקור לא יכול להיות קבוע כאשר אופרנד היעד הוא אוגר סגמנט.
הפקודה XCHG מבנה הפקודה: XCHG אופרנד1 , אופרנד2 ערכי שני האופרנדים מתחלפים. אופרנד1 לא יכול להיות קבוע, ואופרנד2 לא יכול להיות קבוע. האופרנדים לא יכולים להיות שניהם זיכרון.
הפקודות PUSH ו POP מבנה פקודת PUSH: PUSH אופרנד דחיפת אופרנד בגודל 16 ביט למחסנית. האופרנד יכול להיות כל אוגר פרט לאוגרים IP ו FLAGS, האופרנד יכול להיות אופרנד זיכרון, ויכול להיות קבוע. מבנה פקודת POP: POP Op16 שליפת אופרנד מהמחסנית והצבתו לתוך Op16. Op16 יכול להיות כל אוגר פרט ל IP, FLAGS וCS , יכול להיות התייחסות לזיכרון 16 ביט. Op16 לא יכול להיות קבוע.
הפקודה PUSHF: דחיפת את אוגר הדגלים לתוך המחסנית. הפקודה POPF: שליפת 16 ביטים מהמחסנית והצבתם בתוך אוגר הדגלים. ב 386 ואילך פקודות הדחיפה למחסנית והשליפה מהמחסנית הן PUSHDF ו POPDF עבור אוגר הדגלים המורחב EFLAGS.
הפקודה ADD מבנה הפקודה: ADD אופרנד1, אופרנד2 יחשב אופרנד1+אופרנד2=אופרנד2. הפקודה ADC היא חיבור עם שארית (carry). הכללים לגבי האופרנדים זהים לכללים בפקודה MOV. דוגמה: נניח שמוגדרים המשתנים הבאים: .DATA Var1 DW 100 Var2 DW 130 Var3 DW ? נחשב Var3 = Var1+Var2: MOV AX,Var1 ADD AX,Var2 MOV Var3,AX
דוגמה נוספת: אם מוגדרים המשתנים: Var4 DD 71234 Var5 DD 45678 חישוב Var4=Var4+Var5 באוגרים 16 ביט של ה-8086: MOX AX , WORD PTR Var5 ADD WORD PTR Var4 , AX MOV AX , WORD PTR Var5+2 ADC WORD PTR Var4+2 , AX
הפקודה SUB מבנה הפקודה: SUB אופרנד1, אופרנד2 יחשב אופרנד1-אופרנד2=אופרנד2 הפקודה SBB היא חיסור עם שארית (borrow). הכללים לגבי האופרנדים זהים לכללים בפקודה MOV. דוגמה: נחשב Var3 = Var1-Var2: MOV AX,Var1 SUB AX,Var2 MOV Var3,AX חישוב Var4=Var4-Var5 באוגרים 16 ביט של ה- 8086: MOV AX,WORD PTR Var5 SUB WORD PTR Var4,AX MOV AX,WORD PTR Var5+2 SBB WORD PTR Var4+2,AX
הפקודות INC, DEC ו NEG מבנה הפקודה INC: INC אופרנד קידום האופרנד ב-1. האופרנד יכול להיות אוגר או זיכרון. מבנה הפקודה DEC: DEC אופרנד הפחתת האופרנד ב-1. מבנה הפקודה NEG: NEG אופרנד היפוך הסימן
הפקודה MUL מבנה: MUL אופרנד כפל מספרים חסרי סימן. הפקודה IMUL מבצעת כפל מספרים בעלי סימן באופן דומה. האופרנד יכול להיות אוגר (בגודל בית 1 או 2) או זיכרון (בית 1 או 2) אם האופרנד הוא בגודל בית 1 אז מתבצע: אופרנד AX = AL * למשל: הפקודה MUL CL תבצע: AX = AL * CL.
אם האופרנד הוא בגודל 2 בתים אז מתבצע: אופרנדDX : AX = AX * למשל: הפקודה MUL CX תבצע: DX : AX = AX * CX AX מקבל את החלק המשמעותי פחות של התוצאה, ו DX מקבל את החלק המשמעותי יותר. אם תוצאת הכפל חורגת מגודל האופרנדים, נראה זאת בדגלים CF ו OF. ב 386 ואילך, עבור אופרנד בגודל 4 בתים אז מתבצע: אופרנדEDX : EAX = EAX * ב- 386 ואילך, פקודת IMUL תומכת גם בפקודת 2 אופרנדים כאשר שניהם יכולים להיות רק אוגרים 32 ביט. למשל: הפקודה IMUL ESI,EDI תבצע: ESI = ESI * EDI. לא ניתן להתמודד עם תוצאת כפל החורגת מגודל האופרנדים המקוריים.
הפקודה DIV מבנה: DIV אופרנד חילוק מספרים חסרי סימן. הפקודה IDIV תבצע חילוק מספרים בעלי סימן. האופרנד יכול להיות אוגר (בגודל בית 1 או 2) או זיכרון (בית 1 או 2) אם האופרנד הוא בגודל בית 1 אז מתבצע: אופרנדAX/ התוצאה ללא שארית תוצב ב AL והשארית ב AH. למשל: MOV AX,1003 MOV BL,4 DIV BL אז AL יהיה 250 ו AH יהיה 3
אם האופרנד הוא בגודל 2 בתים אז מתבצע: אופרנדDX:AX/ התוצאה ללא שארית תוצב ב AX והשארית ב DX. למשל: אם מוגדרים המשתנים: .DATA Var1 DW 5000 Var2 DW 1300 אז כדי לחשב Var1/Var2 נרשום: MOV AX,Var1 MOV DX,0 DIV Var2 הערך של AX יהיה 3 והערך של DX יהיה 100.
כאשר מחלקים מספרים באותו גודל ע"י DIV יש לאפס את AH כאשר המספרים בגודל 8 ביט, ואת DX כאשר המספרים בגודל 16 ביט. עבור IDIV נשתמש בפקודה CBW להמרת AL ל AX תוך התחשבות בסימן, או ב CWD להמרת AX ל DX:AX תוך התחשבות בסימן. ב 386 ואילך, עבור אופרנד בגודל 4 בתים הפקודה אופרנד DIV תבצע: תוצאת החילוק ללא השארית תוצב ב EAX והשארית תוצב ב EDX. על מנת לבצע חלוקה של שני מספרים 32 ביט, במקרה של DIV יש לאפס את EDX. במקרה של IDIV נשתמש בפקודה CDQ שממירה את EAX ל EDX:EAX. ישנה פקודה CWDE שממירה את AX ל EAX. אם תוצאת החילוק לא יכולה להיכנס ל AL/AX/EAX בגלל גודלה מתרחשת חריגה שנקראת Divide Overflow.
הפקודה CMP מבנה: CMP אופרנד1, אופרנד2 השוואה בין האופרנדים ע"י פעולת חיסור. האופרנדים לא משנים את ערכם.
פקודות בקרה CALL – בקרה לרוטינה , קפיצה עם אכסון ה IP במחסנית (ואפשר גם ה-CS). RET – פקודה הפוכה ל CALL INT- הסתעפות לפסיקת תוכנה
פקודות קפיצה JMP – קפיצה בלתי מותנית. פקודת לולאה: LOOP – הפחתת CX, וקפיצה לתוית אם CX לא התאפס כתוצאה מההפחתה. LOOPE/Z – כמו LOOP אך סיום הלולאה הוא כאשר CX שווה 0 או ZF=0. LOOPNE/NZ – כמו LOOP/Z אך התנאי הנוסף הוא ZF=1. JCXZ – קפיצה רק אם CX=0 .
פקודות קפיצה מותנות: בדרך כלל השימוש שלהם הוא בשילוב עם הפקודה CMP למשל: CMP AX,BX JE label ואז משמעות הפקודות הן: JE – קפוץ אם AX שווה ל BX. JNE – קפוץ אם AX שונה מ BX. JG – קפוץ אם AX > BX כמספרים עם סימן. JGE – קפוץ אם AX ≥ BX כמספרים עם סימן. JL - קפוץ אם AX < BX כמספרים עם סימן. JLE – קפוץ אם AX ≤ BX כמספרים עם סימן. JA – קפוץ אם AX > BX כמספרים חסרי סימן. JAE – קפוץ אם AX ≥ BX כמספרים חסרי סימן. JB - קפוץ אם AX < BX כמספרים חסרי סימן. JBE – קפוץ אם AX ≤ BX כמספרים חסרי סימן.
פעולות ביטיות מבנה הפקודה XOR: XOR אופרנד1, אופרנד2 מבנה הפקודה AND: AND אופרנד1, אופרנד2 מבצעת AND לוגי על הביטים של אופרנד1 ואופרנד2 (אם שני הביטים הם 1 התוצאה תהיה 1, בכל מקרה אחר התוצאה היא 0), התוצאה תהיה באופרנד2. מבנה הפקודה OR: OR אופרנד1, אופרנד2 מבצעת OR לוגי על הביטים של אופרנד1 ואופרנד2 (אם שני הביטים הם 0 התוצאה תהיה 0, בכל מקרה אחר התוצאה היא 1), התוצאה תהיה באופרנד2. מבנה הפקודה XOR: XOR אופרנד1, אופרנד2 מבצעת XOR לוגי על הביטים של אופרנד1 ואופרנד2 (אם רק אחד מהביטים הוא 1 התוצאה תהיה 1, בכל מקרה אחר התוצאה היא 0), התוצאה תהיה באופרנד2.
מבנה הפקודה NOT: NOT אופרנד מבצעת NOT לוגי על הביטים של האופרנד (אם הביט הוא 1 התוצאה תהיה 0, אם הביט הוא 0 התוצאה תהיה 1). הפקודה TEST: מבצעת AND בלי לשנות את האופרנדים. (רק הדגלים מושפעים)
פקודות הזזה וסיבוב SHL dest,source הזזה של dest ב source ביטים שמאלה. הביט המשמעותי ביותר נכנס ל carry . לתוך הביטים הנמוכים יכנס 0. דוגמה: נניח שהתוכן של DL הוא 10000001 ו CF=1 ,אז אחרי הפקודה SHL DL,1 הערך שלDL הוא 00000010 ו CF=1. SHR dest,source הזזה של dest ב source ביטים ימינה. הביטים המשמעותיים ביותר מתאפסים. הביטים הנמוכים נאבדים. דוגמה: נניח שהתוכן של DL הוא 10000001 ו CF=1 ,אז אחרי הפקודה SHR DL,1 הערך שלDL הוא 01000000 ו CF=1.
ROR dest,source כמו SHR אבל הביט הפחות משמעותי עובר לתוך הביט המשמעותי ביותר וגם לתוך ה CF דוגמה: נניח שהתוכן של DL הוא 10000001 ו CF=0 ,אז אחרי הפקודה ROR DL,1 הערך שלDL הוא 11000000 ו CF=1. ROL – כמו ROR אך הכיוון הוא שמאלה. RCR – כמו ROR אך CF הוא חלק מהאופרנד: הביט הפחות משמעותי עובר לתוך ה CF וערך ה CF עובר לתוך הביט המשמעותי ביותר. דוגמה: נניח שהתוכן של DL הוא 10000001 ו CF=0 ,אז אחרי הפקודה ROR DL,1 הערך שלDL הוא 01000000 ו CF=1. RCL – כמו RCR אך הכיוון הוא שמאלה.
פקודות במחרוזות LODSB – הכנסת תוכן הבית שכתובתו DS:SI לאוגר AL וקידום/הפחתת SI ב-1. LODSW – הכנסת תוכן המילה שכתובתה DS:SI לאוגר AX וקידום/הפחתת SI ב-2. STOSB – העתקת הבית הנמצא ב AL לכתובת ES:DI וקידום/הפחתת DI ב-1. STOSW – העתקת המילה הנמצאת ב AX לכתובת ES:DI וקידום/הפחתת DI ב-2. ערך הדגל DF קובע אם יתבצע קידום או הפחתה. אם DF=0 מתבצע קידום. אם DF=1 מתבצעת הפחתה. הפקודה CLD מציבה 0 ל DF. הפקודה STD מציבה 1 ל DF.
דוגמה: נניח שמוגדר המערך הבא: Word_Arr DW 2,4,6 והפקודות הן: STD MOV SI,OFFSET Word_Arr+2 LODSW אז ב AX תהיה המילה השנייה במערך, כלומר AX=4 ו יתבצע SI=SI-2.
דוגמה נוספת: נניח שמוגדר המערך הבא: Word_Arr DW 2,4,6 והפקודות הן: STD MOV AX,8 MOV DI,OFFSET Word_Arr+2 STOSW אז המילה השנייה במערך תשתנה ל 8, ויתבצע DI=DI-2.
REP – פקודת המחרוזת תחזור על עצמה כמספר הפעמים שהוא הערך של CX REP – פקודת המחרוזת תחזור על עצמה כמספר הפעמים שהוא הערך של CX. בכל ביצוע של הפקודה, CX יופחת ב 1. דוגמה: נניח שמוגדר המערך הבא: W_array DW 1,2,3,4,5,6,7,8 והפקודות הן: MOV SI , OFFSET W_array MOV BX , SEG W_array MOV CX , 8 MOV AX , 1000 MOV ES,BX CLD REP STOSW אז אברי המערך יהיו כולם 1000.
MOVSB – העתקת הבית שכתובתו DS:SI לכתובת ES:DI וקידום/הפחתת DI ו SI ב-1. MOVSW – העתקת המילה שכתובתה DS:SI לכתובת ES:DI וקידום/הפחתת DI ו SI ב-2. SCASB – השוואת הבית הנמצא ב AL לבית שכתובתו ES:DI וקידום/הפחתת DI ב-1. SCASW – השוואת המילה הנמצאת ב AX לבית שכתובתו ES:DI וקידום/הפחתת DI ב-2. CMPSB – השוואת תוכן הבית שכתובתו DS:SI לתוכן הבית שכתובתו ES:DI וקידום/הפחתת DI ו SI ב-1. CMPSW – השוואת תוכן המילה שכתובתה DS:SI לתוכן המילה שכתובתה ES:DI וקידום/הפחתת DI ו SI ב-2.