Files
assembly-project/אסמבלי.txt
2022-02-25 15:55:38 +02:00

377 lines
18 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
כתובת בסיס - כתובת תחילת המקטע
כתובת יחסית- ההיסט מתחילת המקטע
כתובת לוגית- היסט:בסיס
כתובת מוחלטת(פיזית)- בסיס*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