377 lines
18 KiB
Plaintext
377 lines
18 KiB
Plaintext
כתובת בסיס - כתובת תחילת המקטע
|
||
כתובת יחסית- ההיסט מתחילת המקטע
|
||
כתובת לוגית- היסט:בסיס
|
||
כתובת מוחלטת(פיזית)- בסיס*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
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|