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







