כתובת בסיס - כתובת תחילת המקטע כתובת יחסית- ההיסט מתחילת המקטע כתובת לוגית- היסט:בסיס כתובת מוחלטת(פיזית)- בסיס*16 + היסט ------------------------------ CS מקטע הקוד DS מקטע הנתונים SS סוף (מלמטה) של המחסנית (ES מקטע מיוחד) ברגיל ES=CS AX BX CX DX IP השורה הנוכחית SP הנקודה הנוכחית במחסנית BP כתובת לניווט במחסנית SI כתובת מקור DI כתובת יעד ------------------------------ FLAGS : OF OVERFLOW אם מספר מסומן עולה על הגודל שלו, או שהמספר המשמעותי השתנה(שינה סימן) DF DIRACTION אחד אומר אחורה, אפס אומר קדימה SF SIGN העתק של הסימן של המספר (אחרי SUB או CMP הוא אומר אם מספר מסומן קטן מ) ZF ZERO אם התוצאה היא אפס, להשוות בין מספרים CF CARRY אם מספר מסומן הגיע לגבול, גם שומר את הביט ששומש בפקודות סיבוב ודחיפה, (אחרי SUB או CMP הוא אומר אם מספר לא מסומן קטן מ) ------------------------------ מיעון אוגר: כששתי האופרנדים הם אוגרים מיעון מידי: כשאחד האופרנדים הוא אוגר והשני קבוע מיעון ישיר: [כתובת]:סגמנט שם משתנה מיעון עקיף: [אוגר שמכיל כתובת] מעתיק את מה שבכתובת שהאוגר מצביע עליו פנייה לזיכרון: BX SI DI היסטים מתחילת מקטע הנתונים BP היסט מתחילת מקטע המחסנית כשהפנייה לזיכרון מתבצעת בעזרת שם משתנה המחשב יודע לכמה בתים בזיכרון צריך להתייחס גם בקבועים כנל באוגרים אם יש פנייה לזיכרון בלי משתנה או אוגר, והאופרנד השני קבוע, צריך לכתוב את מספר הבתים בעזרת BYTE PTR / WORD PTR אפשריות שוות: [R+O] [R] + O [R][O] [R]O ------------------------------ MOV D, S D = S מעתיק את המקור ליעד יעד לא יכול להיות קבוע יעד לא יכול להיות CS יעד ומקור לא יכולים להיות אוגרי סגמנט באותו זמן כשהיעד סגמנט אז המקור לא יכול להיות קבוע XCHG D,S D = S S = D מחליף את תוכן שתי האופרנדים יעד ומקור לא יכולים להיות קבועים ADD D, S D = D + S מחבר את המקור והיעד, ומכניס את התוצאה ליעד יעד לא יכול להיות קבוע יעד לא יכול להיות CS יעד ומקור לא יכולים להיות אוגרי סגמנט באותו זמן כשהיעד סגמנט אז המקור לא יכול להיות קבוע משפיע על הדגלים: ZF,SF,CF,OF SUB D,S D = D - S מפחית את המקור מהיעד, ומכניס את התוצאה ליעד יעד לא יכול להיות קבוע יעד לא יכול להיות CS יעד ומקור לא יכולים להיות אוגרי סגמנט באותו זמן כשהיעד סגמנט אז המקור לא יכול להיות קבוע משפיע על הדגלים: ZF,SF,CF,OF ADC D,S D = D + S + CF מחבר את המקור והיעד וCF, ומכניס את התוצאה ליעד יעד לא יכול להיות קבוע יעד לא יכול להיות CS יעד ומקור לא יכולים להיות אוגרי סגמנט באותו זמן כשהיעד סגמנט אז המקור לא יכול להיות קבוע משפיע על הדגלים: ZF,SF,CF,OF SBB D,S D = D - S - CF מפחית את המקור וCF מהיעד, ומכניס את התוצאה ליעד יעד לא יכול להיות קבוע יעד לא יכול להיות CS יעד ומקור לא יכולים להיות אוגרי סגמנט באותו זמן כשהיעד סגמנט אז המקור לא יכול להיות קבוע משפיע על הדגלים: ZF,SF,CF,OF INC O O = O + 1 מוסיף לאופרנד 1 האופרנד יכול להיות אוגר או זיכרון משפיע על הדגלים: ZF,SF,OF DEC O O = O - 1 מפחית מהאופרנד 1 האופרנד יכול להיות אוגר או זיכרון משפיע על הדגלים: ZF,SF,OF NEG O O = -O משנה סימן לאופרנד האופרנד יכול להיות אוגר או זיכרון משפיע על הדגלים: SF,CF MUL O BYTE- AX = AL * O WORD - DX:AX = AX * O מכפיל מספרים חסרי סימן ומכניס את התוצאה לAX או לDX ו AX, בהתאם לגודל האופרנד יכול להיות אוגר או זיכרון DIV O BYTE- AL = AX/O AH = AX%O WORD- AX = AX/O DX = AX%O מחלק מספרים חסרי סימן ומכניס את התוצאה לAX או לDX ו AX, בהתאם לגודל האופרנד יכול להיות אוגר או זיכרון אם רוצים לבצע חלוקה בבית יש לאפס את AH אם רוצים לבצע חלוקה במילה יש לאפס את DX IMUL O MUL O BYTE- AX = AL * O WORD - DX:AX = AX * O מכפיל מספרים מסומנים ומכניס את התוצאה לAX או לDX ו AX, בהתאם לגודל האופרנד יכול להיות אוגר או זיכרון IDIV O BYTE- AL = AX/O AH = AX%O WORD- AX = AX/O DX = AX%O מחלק מספרים מסומנים ומכניס את התוצאה לAX או לDX ו AX, בהתאם לגודל האופרנד יכול להיות אוגר או זיכרון אם רוצים לבצע חלוקה בבית יש להשתמש ב CBW לאפס את AH עם התחשבות בסימן אם רוצים לבצע חלוקה במילה יש להשתמש ב CWD לאפס את DX עם התחשבות בסימן CBW (AL = X0000000) AX = XXXXXXXX X0000000 משנה את כל הביטים שבAH לספרה הכי משמעותית שבAL CWD (AX = X0000000 00000000) DX = XXXXXXXX XXXXXXXX משנה את כל הביטים שבDX לספרה הכי משמעותית שבAX CMP D,S D-S משפיע על הדגלים ZF,SF,CF,OF לפי התוצאה SHL O, TIMES (O = 11100110) O = 11001100 : TIMES == 1 CF = 1 OF = 0 דוחף את כל הביטים של O מספר צעדים שמאלה, ומכניס 0 מצד ימין (מכפיל בשתיים), ומכניס לCF את הביט המושפע משפיע על הדגלים: CF , ZF , SF, OF SAL O,TIMES (O = 11100110) O = 11001100 : TIMES == 1 CF = 1 OF = 0 דוחף את כל הביטים של O מספר צעדים שמאלה, ומכניס 0 מצד ימין (מכפיל בשתיים), ומכניס לCF את הביט המושפע משפיע על הדגלים: CF , ZF , SF, OF SHR O, TIMES (O = 11100110) O = 01110011 : TIMES == 1 CF = 0 OF = 1 דוחף את כל הביטים של O מספר צעדים ימינה, ומכניס 0 מצד שמאל (מחלק בשתיים), ומכניס לCF את הביט המושפע משפיע על הדגלים: CF , ZF , SF, OF SAR O, TIMES (O = 11100110) O = 11110011 : TIMES == 1 CF = 0 דוחף את כל הביטים של O מספר צעדים ימינה, ומכניס את הביט המשמעותי ביותר מצד שמאל (מחלק בשתיים), ומכניס לCF את הביט המושפע משפיע על הדגלים: CF , ZF , SF ROL O, TIMES (O = 11100110) O = 11001101 : TIMES == 1 CF = 1 מסובב את הביטים של O לשמאל, ומכניס לCF את הביט המושפע משפיע על הדגלים: OF, CF RCL O,TIMES (O = 11100110) O = 11001100 : TIMES == 1 CF = 1 דוחף את הביטים של O לשמאל, דוחף את CF לימין, ומכניס לCF את הביט המושפע משפיע על הדגלים: OF, CF ROR O, TIMES (O = 11100110) O = 01110011 : TIMES == 1 CF = 0 מסובב את הביטים של O לימין, ומכניס לCF את הביט המושפע משפיע על הדגלים: OF, CF RCR O, TIMES (O = 11100110) O = 11110011 : TIMES == 1 CF = 0 דוחף את הביטים של O לימין, דוחף את CF לשמאל, ומכניס לCF את הביט המושפע משפיע על הדגלים: OF, CF LOOP L WHILE (CX!=0) {CX-- } לולאה שחוזרת לL כל פעם עד ש CX = 0 JCXZ L CMP CX,0 && JUMP L מקצר את שתי הפקודות שבודקות אם CX = 0 ------------------------------ קפיצה לא מותנת: JMP L קופץ לתווית שבאופרנד L קפיצה מותנת: (הערה: כל הקפיצות המותנות מתחילות ב J, והאות השנייה היא הדגל הנבדק ברוב המקרים, הקפיצה תפעל במידה והדגל = 1. כשכתוב באות השנייה N זה אומר שהקפיצה תפעל במידה והדגל = 0. ) מגיעה אחרי CMP D,S JE D = S JC CF = 1 JS SF = 1 JZ ZF = 1 JO OF = 1 JNE D != S JNC CF = 0 JNS SF =0 JNZ ZF = 0 JNO OF = 0 קפיצה לחסרי סימן: JA D > S JAE D >= S JB D < S JBE D <= S קפיצה למסומנים: JG D > S JGE D >= S JL D < S JLE D <= S ------------------------------ בהוראות לוגיות, המחשב עובר בכל ביט ביעד ובמקור, ומשנה את הביט שבאותו מקום ביעד וחוץ מההוראה NOT כל ההוראות משפיעות על הדגלים ZF,SF לפי התוצאה הסופית שהתקבלה AND D,S D == 1 && S == 1 OR D,S D == 1 || S == 1 XOR D,S D != S NOT O O = !O TEST D,S D == 1 && S == 1 התוצאה בהוראה הזאת, לא משנה את היעד, רק משנה את הדגלים ------------------------------ מחסנית: ציור המחסנית: SS - - - - - - SP SS אוגר תחילת כתובת המחסנית(האיבר הכי גבוה והאחרון) SP אוגר היסט מתחילת המחסנית (כשיוצרים את המחסנית הוא נמצא בית אחד אחרי תחילת המחסנית) PUSH O SP -= 2 דוחפת איבר למחסנית, לנקודה הכי גבוהה POP O SP += 2 שולפת איבר מהמחסנית, מהנקודה הכי גבוהה O תמיד יהיה שתי בתים ------------------------------ פרוצדורה: מבנה הפרוצדורה: PROC NEAR שם_הפרוצדורה פקודות ENDP שם_הפרוצדורה הפרוצדורה תמיד תהיה בין הEXIT לEND CALL L PUSH IP && SP -= 2 קורא לפרוצדורה, שומר במחסנית את IP ומפחית את SP ב2 RET (O) POP IP && SP += 2 מכניס את הSP לתוך IP ומקדמת את SP בשתיים במידה והוצב O הפרוצדורה מנקה גם את מספר הבתים שנכתב יש לזכור שאפשר להכניס ולהוציא רק מילים ולא בתים! קבלת פרמטרים: PUSH BP MOV BP, SP POP BP RET בעזרת הפקודות שלמעלה, תוכל לעבור בין האיברים במחסנית, ולקבל פרמטרים. כדי להגיע לאיבר X מהלמעלה של המחסנית: תצטרך לכתוב [BP + (2X +2)] מכיוון שאתה רוצה לדלג על הIP שהכנסת בקריאה לפרוצדורה וגם לקבל שתי בתים בכל פעם ------------------------------ מחרוזות: כל פקודות המחרוזות בדרך כלל מגיעות בלי פרמטרים חלק מהפקודות משתמשות בES אז לא לשכוח בתחילת הקוד לשנות אותו גם לAX (בנוסף לDS) ידע כללי שיכול לעזור: כשמדברים על פקודות שמעבירות אל אוגר כמו LODSB המקום שממנו מעבירים תמיד יהיה DS:SI ולהפך תמיד יהיה ES:DI לא לשכוח שאם DF=0 אז זה להוסיף ולהפך אני מסכם את כל הפקודות בעזרת פקודות אחרות: LODSB MOV AL, [DS:SI] INC SI \ DEC SI LODSW MOV AX, [DS:SI] ADD SI, 2 \ SUB SI, 2 STOSB MOV [ES:DI], AL INC DI \ DEC DI STOSW MOV [ES:DI], AX ADD DI, 2 \ SUB DI, 2 MOVSB MOV ES:DI, BYTE PTR [DS:SI] INC SI \ DEC SI INC DI \ DEC DI MOVSW MOV ES:DI, WORD PTR [DS:SI] ADD SI, 2 \ SUB SI, 2 ADD DI, 2 \ SUB DI, 2 SCASB CMP AL, [ES:DI] INC DI \ DEC DI SCASW CMP AX, [ES:DI] ADD DI, 2 \ SUB DI, 2 CMPSB CMP [DS:SI], [ES:DI] INC SI \ DEC SI INC DI \ DEC DI CMPSW CMP [DS:SI], [ES:DI] ADD SI, 2 \ SUB SI, 2 ADD DI, 2 \ SUB DI, 2 REP C חוזר על פקודת המחרוזת עד ש CX = 0 ובכל פעם מוריד את CX באחד REPE C חוזר על פקודת המחרוזת עד ש CX = 0 ורק אם ZF = 1 ובכל פעם מוריד את CX באחד (יעיל בעיקר ל CMPSB SCASB ולWORDS) REPNE C חוזר על פקודת המחרוזת עד ש CX = 0 ורק אם ZF = 0 ובכל פעם מוריד את CX באחד (יעיל בעיקר ל CMPSB SCASB ולWORDS) ------------------------------ הערות חשובות: כשמשתמשים בוורד חייבים להוסיף 2 ולא 1 low מעל high 0000000011111111 high low 11111111 low 00000000 high