Intro to 8086 Assembly Language

Download Report

Transcript Intro to 8086 Assembly Language

‫מרכיבים עיקריים של מערכת מבוססת מיקרו‬
‫מחשב‬
‫יחידת ממשק‬
‫‪Interface‬‬
‫זכרון‬
‫קריאה‪/‬כתיבה‬
‫‪RAM‬‬
‫זכרון קריאה בלבד‬
‫‪ROM‬‬
‫יחידת‬
‫עיבוד‬
‫מרכזית‬
‫‪ADDRESS BUS‬‬
‫שעון‬
‫‪CPU‬‬
‫‪DATA BUS‬‬
‫‪CONTROL BUS‬‬
‫‪clock‬‬
‫עיקרון עבודת המערכת מבוססת מיקרו מחשב‬
‫מערכת מבוססת מיקרו מחשב כוללת את שלושת המרכיבים הבאים‪:‬‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫‪ - )Microprocessor( Central Processing Unit - CPU‬יחידת עיבוד מרכזית (מעבד )‬
‫‪ - Main Memory‬זיכרון ראשי בו מאוחסנים פקודות ונתונים של התוכנית בזמן ביצוע‬
‫‪ – Input/Output Devices‬התקנים ליצירת קשר בין המעבד לבין המשתמש‬
‫‪ – Memory and I/O Subsystem‬פסים להעברת מידע בין המעבד לבין הזיכרון‬
‫ובין המעבד לבין התקני קלט‪/‬פלט‬
‫‪ - Address Bus‬מעביר כתובת גישה ממעבד לתאי זיכרון או להתקני קלט‪/‬פלט‬
‫ מעביר נתונים‬‫‪Data Bus‬‬
‫‪ - Control Bus‬מעביר אותות בקרה לניהול גישה לזיכרון ו להתקני קלט‪/‬פלט‬
‫› כל מסלול הוא למעשה אוסף של קווים המקשרים את ה‪ CPU -‬אל מרכיבי המערכת‪ .‬כל מרכיבי‬
‫המערכת מחוברים אל ה‪ CPU -‬במקביל ‪.‬‬
‫•‬
‫כל משימה שהמערכת צריכה לבצע ‪ ,‬כתובה כתוכנית בשפת תכנות כלשהי‪ ,‬מתורגמת‬
‫לשפת מכונה ע"י קומפיילר ומאוחסנת בזיכרון כאוסף נתונים בינאריים בסדר מסוים‬
‫( ‪.)Set of Operation Codes - OpCodes‬‬
‫•‬
‫אלמנת לבצע המשימה ה‪ CPU-‬פונה לאזור בזיכרון הראשי איפה נמצאת התוכנית המקודדת‪ ,‬מביא את‬
‫ה‪ Opcode -‬של הפקודה הנוכחית מזיכרון אל ה‪ ,CPU-‬מפענח את ה‪ Opcode -‬ומבצע את הפקודה‪,‬‬
‫שוב פעם פונה לזיכרון להבאת פקודה הבאה וכך עד סוף התוכנית‪.‬‬
‫הבאת פקודה לביצוע מהזיכרון אל ה‪CPU -‬‬
‫‪Opcode Fetch Cycle‬‬
‫‪Program counter‬‬
‫‪Address=N‬‬
‫‪Address Bus‬‬
‫‪Opcode‬‬
‫‪Data Bus‬‬
‫‪Instruction‬‬
‫‪Register‬‬
‫‪Opcode N‬‬
‫‪Main Memory‬‬
‫•‬
‫‪Control Bus‬‬
‫‪Clk‬‬
‫‪Rd‬‬
‫‪CPU‬‬
‫ה‪ CPU -‬פונה לאזור בזיכרון הראשי עליו מצביע ה‪ ,Program counter -‬מביא‬
‫את ה‪Opcode -‬של הפקודה הנוכחית מזיכרון אל ה‪ ,CPU-‬מפענח אותה‬
‫ומבצע את הפקודה‪.‬‬
‫שוב פונה לזיכרון להבאת הפקודה הבאה מפענח ומבצע וכך עד סוף התוכנית‪.‬‬
‫מבחינה אחת לפחות‪ ,‬המיקרופרוססור הוא מכונה פשוטה מאוד‪ .‬הוא חוזר‬
‫כל הזמן על הרצף‪:‬‬
‫הבא את ההוראה הבאה מהזיכרון‪Fetch -‬‬
‫•‬
‫בצע את ההוראה ‪Execution -‬‬
‫•‬
‫לך לשלב ‪.1‬‬
‫•‬
‫ארבע שלבי ביצוע הפקודה‬
‫•‬
‫•‬
‫•‬
‫•‬
‫‪ Instruction Fetch‬הבאת ‪ Opcode‬של הפקודה לביצוע מזיכרון ראשי אל ה‪-‬‬
‫‪. CPU‬‬
‫‪ Instruction decode‬פענוח הפקודה( ‪ )Opcode‬שנמצאת באוגר ‪ IP‬ע"י החומרה‬
‫‪ Execution‬ביצוע הפקודה (עיבוד אריתמטי ‪ ,‬אחסון זמני )‬
‫‪ Write back‬כתיבת התוצאות העיבוד חזרה לזיכרון הראשי‬
‫בסך‪-‬הכל קיימות חמש פעולות שונות או חמישה מחזורי פס אפשריים‪:‬‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫קריאה מהזיכרון‪.‬‬
‫כתיבה לזיכרון‪.‬‬
‫קריאה מקלט‪/‬פלט‪.‬‬
‫כתיבה לקלט‪/‬פלט‪.‬‬
‫סרק (פעולה פנימית שאינה דורשת גישה לזיכרון או למיפתח קלט‪/‬פלט)‪.‬‬
‫תכונות של המעבד ‪8086‬‬
‫המעבד ‪ 8086‬יוצר ע"י חברת ‪ INTEL‬בשנת ‪.1978‬‬
‫המעבד ‪ 8086‬בעל תכונות הבאות‪:‬‬
‫•‬
‫•‬
‫רוחב פס נתונים ‪ 16 -‬סיביות‬
‫רוחב אוגרים פנימיים ‪ 16 -‬סיביות ‪ ,‬זאת אומרת שהוא יכול לעבד נתונים בעלי‬
‫‪ 16‬סיביות בפעולות אריתמטיות ‪ -‬לוגיות‬
‫רוחב פס כתובות כלפי זיכרון ‪ 20 -‬סיביות ‪ ,‬זאת אומרת שהוא יכול לגשת‬
‫לזיכרון ראשי בגודל ‪220 = 1,048,576 = 1 Mbyte‬‬
‫רוחב פס כתובות כלפי התקני קלט‪/‬פלט ‪ 16 -‬סיביות ‪ ,‬זאת אומרת שהוא יכול‬
‫להתחבר למספר התקנים‪216 = 64535 Devices :‬‬
‫•‬
‫המעבד ‪ 8086‬יכול לגשת לזיכרון להבאת נתונים בגודל ‪ 1 byte‬או‬
‫‪ 1 word=2 byte‬בגישה אחד‪ ,‬תלוי בפקודה‪.‬‬
‫•‬
‫המעבד ‪ 8088‬דומה מאוד למעבד ‪ 8086‬חוץ מרוחב פס נתונים חיצוני שהוא‬
‫בעל ‪ 8‬סיביות ‪ -‬להבאת נתון בגודל ‪ 1 word=2 byte‬המעבד ‪ 8088‬פעמיים ניגש‬
‫לזיכרון ‪.‬‬
‫•‬
‫•‬
‫•‬
‫‪ 20‬קווי כתובת‬
‫•‬
‫‪ 8‬קווי נתונים‬
‫‪7‬‬
‫הצגת נתון במיקרו מחשב‬
‫ נתונים לא מסומנים‬
MSB
LSB
1 byte – 8 bit
MSB
LSB
1 word – 16 bit
‫ נתונים מסומנים‬
Sign
MSB
LSB
1 byte
Sign
MSB
LSB
1 word
‫תיזמון מחזור הפס‬
BUS -‫ יחידת הקשר ל‬- BIU - BUS INTERFACE UNIT –
EU - EXECUTION UNIT -‫ יחידות הביצוע‬-
‫מיבנה פנימי של המעבד ‪8086‬‬
‫• המעבד ‪ 8086‬נקרא גם כן ‪CPU‬מורכב בתוכו משתי יחידות‬
‫פונקציונאליות יקאריות‪:‬‬
‫‪ o‬יחידה להבאת נתון מזיכרון – ‪BIU – Bus Interface Unit‬‬
‫יחידה זאת בונה את כתובת גישה לזיכרון ‪ ,‬פונה לזיכרון ‪ ,‬קוראת את הפקודה‬
‫הבאה מהזיכרון לפס נתונים ‪ ,‬מעבירה אותה ל‪ CPU-‬ומאחסנת אותה לחוצץ של‬
‫‪ 6‬בתים ‪ -‬תור פקודות( ‪.)QUEUE‬‬
‫יחידת ‪ BIU‬כוללת ‪ 4‬אוגרי סגמנט ‪Code Segment,Data Segment -‬‬
‫‪ - Stack Segment,Extra Segment‬ואוגר ‪( Instruction Pointer‬כולם – ‪16‬‬
‫סיביות)‬
‫‪ o‬יחידת ביצוע – ‪EU – Execution Unit0‬‬
‫יחידה זאת לוקחת פקודות מהחוצץ ומבצעת אותן ללא תלות ביחידת ‪.BIU‬‬
‫החוצץ ( ‪ )QUEUE‬עובד בעיקרון של ‪ – FIFO‬הפקודה שהוכנסה ראשונה לתור‬
‫הפקודות ע"י יחידת ‪ BIU‬יוצת ראשונה לביצוע ע"י יחידת ‪.EU‬‬
‫‪ o‬שתי היחידות האלו מפצלות את עומס עבודת ה‪ CPU-‬כדי לעלות את מהירותו ואת‬
‫יעילותו של המעבד‪.‬‬
8086 ‫אוסף אוגרים של המעבד‬
ES 16 bit
CS 16 bit
SS 16 bit
DS 16 bit
IP 16 bit
BIU registers
(for 20 bit address
generation)
AX 16 bit
BX 16 bit
CX 16 bit
DX 16 bit
EU registers
16 bit arithmetic
AH 8 bit
BH 8 bit
CH 8 bit
DH 8 bit
AL 8 bit
BL 8 bit
CL 8 bit
DL 8 bit
SP 16 bit
BP 16 bit
SI 16 bit
DI 16 bit
FLAGS 16 bit
Extra Segment
Code Segment
Stack Segment
Data Segment
Instruction Pointer
Accumulator
Base Register
Count Register
Data Register
Stack Pointer
Base Pointer
Source Index Register
Destination Index Register
‫חלוקת זיכרון למקטעים‬
DI
Segment Registers
EXTRA
DATA
MEMORY
Address
64K Extra Seg
FFFFFH
ES:0
SI, BX
64K Data
Segment
DS:0
SP
STACK
64K Stack
Segment
SS:0
CODE
IP (PC)
64K Code
Segment
CS:0
00000H
‫אופן גישה לזיכרון ראשי של המעבד ‪8086‬‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫כל תוכנית באופן קבוע מאוחסנת בזיכרון משני (דיסקט‪ ,‬דיסק קשיח‪.) CD-ROM ,‬‬
‫בהזמנת תוכנית לביצוע מערכת הפעלה מעתיקה את התוכנית ‪,‬שהוזמנה בשמה ‪,‬‬
‫מזיכרון משני לזיכרון ראשי ומשם התוכנית ניתנת לגישה מצד המעבד‪.‬‬
‫זיכרון ראשי של המעבד ‪ 8086‬ניתן לגישה ע"י פס כתובות בעל ‪ 20‬סיביות וכולל‬
‫‪ 2^20 = 1 Mbyte‬תאים ברוחב ‪ 8‬סיביות כל תא אחד‪.‬‬
‫האוגרים הפנימיים של המעבד ‪ 8086‬בעלי רוחב ‪ 16‬סיביות ובעזרת אוגר אחד אי‪-‬‬
‫אפשר לבנות כתובת גישה לזיכרון בעלת ‪ 20‬סיביות רוחב‪.‬‬
‫בגלל זה הזיכרון הראשי מחולק למקטעים כך שכל תוכנית ‪,‬שרצה במעבד ‪ ,‬מקבלת‬
‫מספר מוגבל של המקטעים (עד ‪ 4‬מקטעים) בהם מאוחסנים‪:‬‬
‫תוכנה – ב‪ ,Code Segment -‬נתונים ‪-‬ב‪, Data Segment or Extra Segment -‬‬
‫מחסנית – ב‪. Stack Segment -‬‬
‫מערכת הפעלה מנהלת את הזיכרון וממקמת את כל התוכניות שעולות לביצוע‬
‫בסגמנטים משלהם וטוענת את אוגרי המקטעים ( ‪ ) CS, DS, SS, ES‬בהתאם‪.‬‬
‫כל תוכנית שרצה יכולה להשתמש אך ורק בתאי הזיכרון שבתוך המקטעים ולגשת‬
‫אליהם ע"י אוגרי הצבעה פנימיים של המעבד ( בעלי ‪ 16‬סיביות בלבד)‬
‫הגודל המכסימלי של המקטע – ‪2^16 = 64 KBytes‬‬
‫אופן גישה לזיכרון ע"י שילוב אוגר מקטע ואוגר‬
‫הצבעה‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫כתובת מלאה של התא בזיכרון הראשי נקראת כתובת פיזית וכוללת ‪ 20‬סיביות‬
‫הכתובת הזאת נבנה ע"י זוג אוגרים ‪ :‬אוגר מקטע ואוגר הצבעה ‪,‬שכל אחד מהם בעל ‪ 16‬סיביות‬
‫‪ 16‬סיביות עליונות של כתובת התחלתית של המקטע נטענת לאוגר מקטע ע"י מערכת הפעלה‬
‫ונקראת‬
‫כתובת התחלתית של המקטע‬
‫‪ CPU‬מצביע לתוך המקטעים ע"י אוגרי הצבעה וכתובת זאת (בתוך המקטע) בעלת ‪ 16‬סיביות‬
‫נקראת כתובת יחסית ( ‪ ) Offset‬או כתובת אפקטיבית ( ‪) Effective Address‬‬
‫כדי לבנות כתובת פיזית בעלת ‪ 20‬סיביות משני האוגרים‪ ,‬ה‪ CPU-‬טוען תוכן של אוגר המקטע‬
‫לאוגר‬
‫הזזה‪ ,‬מזיז אותה בארבע סיביות כלפי שמאל‪ ,‬מחבר אליו תוכן של אוגר ההצבעה ומפיק את‬
‫תוצאת החיבור לפס כתובות של המערכת‬
‫ה‪, CPU -‬באופן ברירת מחדל ‪ ,‬משייך את אוגרי ההצבעה למקטעים באופן הבא‪:‬‬
‫›‬
‫›‬
‫›‬
‫›‬
‫•‬
‫אוגר )‪ IP (Instruction Pointer ) or PC ( Program Counter‬מצביע לתוך ‪: Code Segment‬‬
‫‪CS:IP‬‬
‫אוגרים ‪ BX,DI,SI‬מצביעים לתוך ‪DS:SI, DS:DI, DS:BX : Data Segment‬‬
‫אוגרים ‪ BP,SP‬מצביעים לתוך ‪SS:SP, SS:BP : Stack Segment‬‬
‫אין ברירת מחדל ל‪ - Extra Segment -‬משתמשים במקטע זה רק לפעולות עם מחרוזות – ‪String‬‬
‫‪Operations‬‬
‫אפשר לשנות את ברירת המחדל ע"י כתיבת זוג אוגרים בפקודה‪DS:BP :‬‬
‫דוגמה לחישוב כתובת פיזית‬
0H
CS:
40000H
04000H
IP
40056H
0056H
CS:IP = 4000:56
Logical Address
Memory
Segment Register
04000 0
Offset
+
Physical or
Absolute Address
040056H
.
0056
0FFFFFH
Programmer’s Model of the 8086
CPU
‫אופן שימוש באוגרים כלליים‬
‫•‬
‫•‬
‫•‬
‫•‬
‫הארכיטקטורה של המעבד ‪ 8086‬כוללת ‪ 8‬אוגרים בעלי רוחב ‪ 16‬סיביות למתרות‬
‫כלליות של אחסון נתונים ולמתרות מיוחדות הבאות‪:‬‬
‫)‪ -- AX (accumulator‬צובר תוצאות של פקודות אריתמטיות‬
‫)‪ – BX (base register‬אוגר הצבעה למקטע הנתונים בזיכרון ראשי –‬
‫מחזיק כתובת יחסית של הנתונים‬
‫‪ -‬משמש כמונה לולאות בפקודה ‪LOOP‬‬‫)‪CX (counter‬‬
‫)‪: DX (data‬‬
‫› משמש כאוגר הרחבה (בנוסף לאוגר ‪ ) AX‬לפעולות אריתמטיות לשמירת החלק העליון של‬
‫התוצאה‪.‬‬
‫› משמש כאוגר אצבעה להתקני קלט‪/‬פלט – מחזיק כתובת גישה להתקני קלט‪/‬פלט‬
‫•‬
‫)‪: SI & DI (Source Index & Destination Index‬‬
‫› אוגר הצבעה למקטע הנתונים בזיכרון ראשי‬
‫› אוגרי הצבעה למחרוזות‬
‫•‬
‫•‬
‫)‪ -- SP (stack pointer‬אוגר הצבעה לראש המחסנית‪ ,‬משתנה אוטומטית עקב‬
‫פקודות גישה למחסנית ( לא מומלץ לטעון או לשנות אותו ידנית)‬
‫)‪ -- BP (base pointer‬אוגר הצבעה לתוך המחסנית – מותר לשימוש חופשי‬
‫דירוג של שפות תכנות‬
‫שפות תכנות מדורגות בשלוש רמות‪:‬‬
‫• ‪ – High level language‬שפת ‪Visual C ,Visual Basic , C#‬‬
‫השפות האלו לא מתייחסות למבנה פנימי של המעבד אלא להיגיון של המשימה בגדול‪.‬‬
‫• ‪Assembly Language - Low level language‬‬
‫השפה זו מתייחסת למבנה פנימי של המעבד ומפרטת למעבד את כל שלבי ביצוע‬
‫של המשימה בהתאם לאוסף פקודות של שפת אסמבלי שמוכר למעבד הזה‪.‬‬
‫• ‪ – Machine language‬שפת מכונה‬
‫•‬
‫בשפה זאת התוכנית מקודדת למספרים בקוד בינארי וישר מוכנה לביצוע ע"י המעבד‪.‬‬
‫כל פקודה של שפת אסמבלי מתורגמת ע"י קומפיילר לפקודה בשפת מכובה וכוללת‬
‫שדות הבאות‪ :‬קידוד של פקודה עצמה שניקרא ‪Operation Code – OPCODE‬‬
‫ומשתנים ( ‪ ) OPERANDS‬כלפיהם מתבצעת את הפקודה‬
‫כל תוכנית שכתובה בשפה עלית או בשפת אסמבלי חייבת לעבור תרגום‬
‫לשפת מכונה‪.‬‬
8086 ‫תרגום לשפת מכונה של המעבד‬
High-level
language
program
Compiler
Assembly
language
program
Assembler
Machine
language
program
8086 ‫ לשפת מכונה של המעבד‬ASM86 ‫• תרגום משפת אסמבלי‬
: ‫מתבצעת בשני שלבים‬
‫ לזיהוי טעויות‬Listing ‫ עם יצירת קובץ‬TASM Compiler ‫› תרגום עצמו ע"י‬
TASM Linker - TLINK ‫› וקישור בין חלקי התוכנית ע"י‬
• TASM/l My_Prog.ASM  My_Prog.OBJ , My_Prog.LST
• TLINK My_Prog.OBJ  My_Prog.EXE
My_Prog.EXE – Executable File
‫שיטות מיעון‬
‫‪ - MOV DX,AX‬אוגר ‪• Register -‬‬
‫אופרנט המקור הוא מספר ; ‪ - MOV DX,20‬מיידי ‪• Immediate -‬‬
‫גישה לנתון לפי כתובתו ; ‪ - TWENTY DW 20h‬ישיר – ‪• Direct‬‬
‫‪; DX 0020h‬‬
‫‪MOV DX,TWENTY‬‬
‫גישה לנתון בעזרת אוגר הצבעה ; ]‪ - MOV DX,[SI‬עקיף ‪• Register Indirect -‬‬
‫‪o‬‬
‫‪o‬‬
‫‪o‬‬
‫‪o‬‬
‫ערך באוגר הצבעה זהו הכתובת יחסית של התא במקטע בזיכרון הראשי‬
‫סוגריים מרובעות [ ] מסמנות מעון עקיף‬
‫בברירת מחדל האוגרים ‪ BX, DI, SI‬מצביעים לתוך ה‪ Data Segment -‬בזוג עם האוגר ‪DS‬‬
‫בברירת מחדל האוגר ‪ BP‬מצביע לתוך ה‪ Stack Segment -‬בזוג עם האוגר ‪SS‬‬
‫‪ o‬אפשר לשנות את ברירת המחדל ע"י כתיבת זוג בפקודה ‪ES:BX; SS:SI‬‬
‫]‪MOV DX,[SS: SI‬‬
‫‪• Based Indexed -‬‬
‫גישה לנתון בעזרת זוג אוגרי הצבעה ; ]‪MOV AX, [BX+DI‬‬
‫‪Pair of registers for use: BX+DI; BX+SI; BP+DI; BP+SI‬‬
‫]‪- MOV AL, [BP+SI+DISP‬‬
‫‪• Based Indexed Plus Displacement‬‬
‫גישה לנתון בעזרת זוג אוגרי הצבעה ועוד היסט מספרי‬
‫‪Data Transfer Instructions‬‬
‫‪• MOV target, source‬‬
‫‪› reg, reg‬‬
‫‪› mem, reg‬‬
‫‪› reg, mem‬‬
‫‪› mem, immed‬‬
‫‪› reg, immed‬‬
‫•‬
‫•‬
‫•‬
‫•‬
‫שני אופרנטים חייבים להיות באותו גודל‬
‫אופרנט המקור יכול להיות ‪:‬אוגר‪ ,‬תא בזיכרון או קבוע (מספר)‬
‫אופרנט המקור יכול להיות ‪:‬אוגר או תא בזיכרון‬
‫אי‪-‬אפשר להעביר נתון מתא בזיכרון לתא בזיכרון באופן ישיר‬
Data Transfer Instructions – Examples
•
•
•
•
•
•
•
•
MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOV
Data,67h
AX, [BX]
BX,CS:Data+4
AX,[SS:SI]
AX, [BX+SI+7]
AX,[BP+SI+2]
AX,BL – Impossible
Data1, Data2 – Impossible
‫פקודות קפיצה עם תנאי‬
• JE / JZ
• JNE / JNZ
Jump equal or jump zero
Z=1
Jump not equal or jump not zeroZ=0
Jump Based on Unsigned Data
•
•
•
•
•
JA / JNBE
JAE / JNB
JB / JNAE
JBE / JNA
Jump above or jump not below/ equal
Jump above/ equal or jump not below
Jump below or jump not above/ equal
Jump below/ equal or jump not above
C=0 & Z=0
C=0
C=1
C=1 or Z=1
Jump Based on Signed Data
• JG / JNLE
• JGE / JNL
• JL / JNGE
Jump greater or jump not less/ equal
Jump greater/ equal or jump not less
Jump less or jump not greater/ equal
S=0 & Z=0
S=0
S=1
• JLE / JNG
Jump less/ equal or jump not greater
S=1 or Z=1
‫ מילוי זיכרון בנתון‬: ‫דוגמה של תוכנית פשוטה בשפת אסמבלי‬
“A”
SSeg
SEGMENT STACK
; Open the Stack Segment
DW 50 DUP (?)
; The Stack Size Is 50 Words
SSeg
ENDS
; Close the Stack Segment
DSeg SEGMENT
; Open the Data Segment
block
DB 100 DUP (0)
; Block for Filling
bl_length
DW 50
; Number of Data for Filling
DSeg ENDS
; Close the Data Segment
CSeg SEGMENT
; Open the Code Segment
ASSUME
CS: CSeg, DS: DSeg,SS:SSeg
main: MOV
AX, DSeg
MOV
DS,AX
MOV
DI, OFFSET block
MOV
AL,’A’
MOV
CX, bl_length
next:
MOV
[DI],AL
INC
DI
LOOP next
INT 3
CSeg ENDS
; Close the Code Segment
END
main
; End the Program Code
‫הייצוג תוכנית בזיכרון ראשי‬
Address
• Code segment (CS), which
defines the main program
3230:0000
or instructions.
CS
• Data segment (DS), which 1750:0000
defines the data you used.
DS
• Stack segment (SS), which
defines the stack.
0100:0000
SS
‫הנחיות של שפת אסמבלי ‪Directives -‬‬
‫הנחיות הן לא פקודות לביצוע ע"י המעבד אלא קובעות לקומפיילר‬
‫איך לתרגם את התוכנית ואיך לארגן את הזיכרון‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫‪ -- SEGMENT‬פותח את המקטע ומגדיר את סוגו‬
‫‪ – ENDS‬סגירת המקטע‬
‫‪ – ORG‬קובע מיקום יחסי של נתון או פקודה בתוך המקטע‬
‫‪ – ASSUME‬משייך את שמו המקטע לאוגר המקטע המתאים‬
‫‪ - Define byte - DB‬הגדרת נתון בגודל ‪byte‬‬
‫‪ - Define word - DW‬הגדרת נתון בגודל ‪word‬‬
‫‪ - Define double word – DD‬הגדרת נתון בגודל ‪ word‬כפול‬
‫‪ - EQU‬הגדרת קבוע ( ‪) Constant‬‬
‫‪ - $‬מסמן את המקום הנוכחי (כתובת ) בשלב הקומפילציה‬
‫‪0‬‬
‫אוגר דגלים של המעבד ‪8086‬‬
‫‪x OF DF IF TF SF ZF x AF x PF x CF‬‬
‫‪15‬‬
‫‪x‬‬
‫‪x‬‬
‫‪x‬‬
‫יחידת ביצוע ‪ EU‬כולל אוגר דגלים ( ‪ ) Flag Register‬שהוא אוסף של‬
‫דגלי מצב וסיביות בקרה‪.‬‬
‫• דגלי מצב מושפעים מפקודות אריתמטיות או פקודות השווה ומזהים את מצבו הנוכחי של המעבד‬
‫• סיביות בקרה קובעות למעבד את אופן עבודתו‬
‫› ‪ - CF Carry Flag- Bit 0‬עולה ל‪ 1-‬אם יש גלישה מגודל האוגר‬
‫› ‪ - PF Parity Flag- Bit 2‬עולה ל‪ 1-‬אם תוכן של האוגר ‪ - AL‬זוגי‬
‫› ‪- AF Auxiliary Carry Flag- Bit 4‬עולה ל‪ 1-‬אם יש גלישה מ‪BCD format-‬‬
‫› ‪- ZF Zero Flag- Bit 6‬עולה ל‪ 1-‬אם תוצאת הפעולה האריתמטית או הלוגית האחרונה היא ‪. 0‬‬
‫› ‪ - SF Sign Flag- Bit 7‬מזהה סימן – ערכו כערכה של הסיבית השמאלית (‪ )MSB‬של התוצאה‬
‫בפעולות חיבור‪/‬חיסור ובפעולות לוגיות‪.‬‬
‫› ‪ - TF Single Step Trap Flag- Bit 8‬סיבית בקרה – מאפשר ביצוע תוכנית בשלבים‬
‫› ‪- IF Interrupt Enable Flag- Bit 9‬סיבית בקרה – מאפשר קבלת בקשות פסיקה מהחומרה‬
‫החיצונית‬
‫› ‪- DF String Instruction Direction Flag- Bit 10‬סיבית בקרה – קובעת כיוון סריקת הזיכרון‬
‫בפעולות עם מחרוזות‬
‫› ‪- OF Overflow Flag- Bit 11‬עולה ל‪ 1-‬אם יש גלישה בפעולות אריתמטיות עם מספרים מסומנים‬
‫› ‪ – Bits 1, 3, 5, 12-15‬לא מוגדרות‬
‫דגל האפס ‪ZERO FLAG-‬‬
‫דוגמאות לפעולות שאחריהן דגל האפס יקבל את נערך "‪:"1‬‬
‫תוצאת השוואה משנה את הדגלים‪,‬‬
‫דגל האפס יעלה ל‪, "1" -‬מכיוון‬
‫שקיים שיוויון‪.‬‬
‫‪MOV DH,5‬‬
‫‪CMP DH,5‬‬
‫‪MOV CL,0FFH‬‬
‫‪ADD CL,1‬‬
‫‪MOV AL,4‬‬
‫‪SUB AL,4‬‬
‫‪ 0FFH‬הוא למעשה (‪ )-1‬לאחר הוספת‬
‫‪ 1‬התשובה היא ‪.0‬‬
‫כאשר אנו כותבים את הפקודות‪:‬‬
‫‪DEC CX‬‬
‫‪JZ FINISH‬‬
‫אנו למעשה נעזרים בדגל האפס‪,‬הפקודה ‪ JZ‬בודקת את מצב הדגל‪ ,‬ועפ"י מצבו מחליטה אם לקפוץ ‪.‬‬
‫דוגמא נוספת‪:‬‬
‫‪CMP DL,4‬‬
‫‪JE GOOD‬‬
?"1"-‫באלו מהמקרים הבאים דגל הסימן יעלה ל‬
1.
MOV DL,0
2.
MOV AL,5
SUB AL,5
3.
MOV AL,0FFH
ADD AL,1
4.
MOV CX,36H
CMP CX,’6’
5.
MOV AH,-2
CMP AH,0FEH
‫דגל הנשא – ‪CARRY FLAG‬‬
‫דוגמאות לפעולות שאחריהן דגל הנשא יקבל את נערך "‪:"1‬‬
‫‪1111 1111‬‬
‫‪+ 0000 0001‬‬
‫‪1 0000 0000‬‬
‫דגל הנשא‬
‫דגל הגלישה – ‪OVERFLOW FLAG‬‬
‫הפקודה מציבה באוגר ‪ CL‬את הערך ‪ ,84H‬שהוא תוצאת‬
‫החיבור‪ ,‬למרות שהמספר יכול להיות מוכל באוגר התבצע גלישה ‪ ,‬מכיוון‬
‫שהוספנו למספר חיובי מספר והתקבלה תשובה שלילית‪.‬‬
‫‪FFH‬‬
‫שווה בערכו ( ‪ )-1‬ולכן כאשר מוסיפים לו ‪ 3‬התשובה היא ‪ , 2‬הערך ‪ 2‬יכול‬
‫מיוצג ולכן דגל הגלישה יהיה ‪ 0‬לוגי להיות‬
‫‪ 81H‬הוא הערך השלילי של ‪ 7FH‬אם נפחית ממנו ‪ 3‬נקבל (‪.(- 82‬‬
‫לא ניתן להציג ערך כזה באוגר ‪ DL‬ולכן תהיה גלישה‪.‬‬
‫‪mov cl,7fh‬‬
‫‪add cl,5‬‬
‫‪mov ah,0ffh‬‬
‫‪add ah,3‬‬
‫‪MOV DL,81H‬‬
‫‪SUB DL,3‬‬
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
AND - Logical And
Usage: AND dest,src
dest=dest(and)src
Modifies flags: CF OF PF SF ZF (AF undefined)
Operands
reg,reg
mem,reg
reg,mem
reg,immed
mem,immed
accum,immed
OR - Inclusive Logical OR
Usage: OR
dest,src dest=dest(or)src
Modifies flags: CF OF PF SF ZF (AF undefined)
Operands
reg,reg
mem,reg
reg,mem
reg,immed
mem8,immed8
mem16,immed16
accum,immed
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
XOR - Exclusive OR
Usage: XOR dest,src
dest=dest(xor)src
Modifies flags: CF OF PF SF ZF (AF undefined)
Operands
reg,reg
mem,reg
reg,mem
reg,immed
mem,immed
accum,immed
NOT - One's Compliment Negation (Logical NOT)
Usage: NOT dest
Modifies flags: None
Inverts the bits of the "dest" operand forming the 1s complement.
Operands
reg
mem
•
•
•
•
•
•
•
•
•
•
•
•
NEG - Two's Complement Negation
Usage: NEG dest
Modifies flags: AF CF OF PF SF ZF
2 -‫מבצע משלים ל‬
Operands
reg
mem
•
•
•
•
•
•
•
TEST - Test For Bit Pattern
Usage: TEST dest,src
Modifies flags: CF OF PF SF ZF (AF undefined)
-‫פקודה זו מבצעת את פעולת ה‬AND .‫אך לא שומרת את הפתרון אלא מעדכנת דגלים בלבד‬
.‫נעדיף להשתמש בפקודה זו לבדיקה של סיבית מסוימת‬
Operands
reg,reg
reg,mem
mem,reg
reg,immed
mem,immed
accum,immed
•
•
•
•
•
.CX ‫ באוגר‬0 ‫ אם המספר חיובי יוצב‬. CX ‫ באוגר‬1 ‫ אם המספר שלילי יוצב‬.‫קטע תוכנית הבודקת את הנתון בכתובת בכתובת‬4F0H
MOV CX,0
TEST BYTE PTR DS:[4F0H],80H
JZ POSITIVE
MOV CX,1
POSITIVE: NOP
‫הנחית של שפת אסמבלי להגדרת נתונים‬
Data ‫• נתונים של תוכנית שמורים ברוב המקרים באזור של‬
:‫ ומוגדרים בצורה הבאה‬Segment
<variable name> DB | DW | DD <value> •
• V1 DB
25h
• V2 DW 28A5h
• V3 DB
11001010b
:‫• מערך נתונים מוגדר בצורה הבאה‬
<arrayname> DB | DW <size>dup (<element>)
• Array DB
10 dup(?)
<arrayname> DB | DW value1, value2, value3
• Integers DB 0, 1, 2, 3, 4
‫ מוגדר בצורה הבאה‬ASCII ‫• מחרוזת נתונים בקוד‬
• <stringname>
DB
‘<string>$’
• String DB
“HELLO$”
‫אופן שמירת נתונים בזיכרון ראשי‬
Bytes in Storage
FFFFFh
‫ שמורים בזיכרון בסדר הפוך‬-Word, Double word
•
01h
Directive
Data1 DW
Data2 DW
Data3 DD
23h
35DAh
256
1234567H
45h
67h
Data3
01h
00
Data2
35h
DAh
Data1
00000
Constants - ‫הגדרת קבועים‬
• name EQU expression
‫הגדרת קבוע ללא שינוי בהמשך התוכנית‬
sample
EQU 7Fh ; ‫ערך מספרי‬
message
EQU <This is a message> ; ‫מחרוזת‬
• Name = expression
‫הגדרת קבוע עם שינוי בהמשך התוכנית – ערך מספרי בלבד‬
max_int = 7FFFh
count = 1
count = count * 2
‫‪Basic structure of Code Segment‬‬
‫•‬
‫‪ -Code Segment‬מקטע שכולל תוכנית מקודדת לביצוע המשימה ע"י המעבד‬
‫•‬
‫•‬
‫תוכנית בשפת אסמבלי ‪ ASM86‬זוהי אוסף פקודות שמוכרות למעבד ‪8086‬‬
‫כל פקודה בנויה לפי תבנית הבאה‪:‬‬
‫>‪<Label>:<Mnemonic> <Destination_Operand,Source_Operand> ; <Comment‬‬
‫•‬
‫>‪ - <label name‬תווית ‪ -‬שם סימבולי קטן מ‪ 31-‬תווים ‪ ,‬לא מתחיל מספרה ‪ ,‬לא מילה שמורה‬
‫•‬
‫>‪ - <Mnemonic‬שם הפקודה מאוסף ‪ ,‬מוכר למעבד ‪8086‬‬
‫•‬
‫>‪ - <Destination_Operand,Source_Operand‬שני אופרנטים שמשתתפים בפקודה‬
‫› העברת הנתון תמיד מתבצעת מאופרנט המקור לאופרנט היעד‬
‫› בפעולות אריתמטיות‪/‬לוגיות תוצאה תמיד נכנסת לאופרנט היעד‬
‫•‬
‫>‪ - <Comment‬טקסט שמלווה את הפקודה אלמנת להסביר תוכנית‬
‫‪;Load number 86h to Data_Addr in Main Memory‬‬
‫‪L1: MOV Data_Addr ,86h‬‬
‫•‬
‫שיגרה‬-‫הגדרת תת‬
Main Program
Proc1
Proc2
Proc3
<procedure name> PROC {FAR | NEAR}
:
:
;***your (main/ sub) program here***
<procedure name> ENDP
‫ חייב להיות מיוחד‬- <procedure name>
‫שיגרה‬-‫ הנחיה לקומפיילר להתחיל תת‬- PROC
‫שיגרה‬-‫ הנחיה לקומפיילר לסיים תת‬- ENDP
‫ הנוכחי‬Code Segment -‫שיגרה נקראת מחוץ ל‬-‫ – תת‬Far
‫ הנוכחי‬Code Segment ‫שיגרה נקראת אותו‬-‫ תת‬- Near
•
•
•
•
•
Segmentation Example: MOV AX,[BX]
MOV Instruction ⇒ DS
Effective Address = BX
Logical Address = DS:BX = 2100:0123
Segmentation Example:
MOV AX,[BX+SI+7]
Segmentation Example:
MOV AX,[BP+SI+2]
Change data size operator - ptr
<type> PTR <expression>
Operator ptr for change data size definition
(from double word to byte or to word for example)
Data
DW
1234H
MOV byte ptr Data,55h
MOV AL, byte ptr Data+1
; [Data] 1255h
; AL12h
‫פקודת החלפה‬
• XCHG target, source
› reg, reg
› reg, mem
› mem, reg
For example:
DATA DW 20
• XCHG BL, AH
• XCHG DATA, AX
‫אפשר לבצע את‬-‫ אי‬XCHG -‫ ו‬MOV ‫• בפקודות‬
‫העברת הנתונים בין שני תאי זיכרון‬
‫‪Address Loading Instructions‬‬
‫•‬
‫•‬
‫•‬
‫>‪ ; LEA <reg16>, <EA‬טעינת כתובת יחסית של הנתון במקטע נתונים לאוגר הצבעה‬
‫>‪ ; MOV <reg16>, offset<data‬טעינת כתובת יחסית של הנתון במקטע נתונים‬
‫לאוגר הצבעה‬
‫>‪ ; LDS < reg16>,<Mem32‬טעינת אוגר הצבעה בעל ‪ 16‬סיביות ובנוסף אוגר‬
‫מקטע ‪ DS‬בנתון ששמור בזיכרון כדי להכין כתובת‬
‫חדשה מלאה‬
‫>‪; LES < reg16>,<Mem32‬טעינת אוגר הצבעה בעל ‪ 16‬סיביות ובנוסף אוגר‬
‫מקטע ‪ ES‬בנתון ששמור בזיכרון כדי להכין כתובת‬
‫חדשה מלאה‬
‫‪DSEG SEGMENT‬‬
‫‪ORG 10H‬‬
‫‪Data‬‬
‫‪DD 12345670H‬‬
‫‪-----‬‬‫‪› LDS SI, Data‬‬
‫‪;SI <= 5670H, DS <=1234H‬‬
‫‪› LEA DI,Data‬‬
‫‪;DI <=10H offset of Data from Data Segment‬‬
‫‪Beginning‬‬
‫‪; the same operation‬‬
‫‪› MOV DI, offset Data‬‬
‫אופן הגדרת המחסנית בתוכנית‬
‫•‬
‫מחסנית היא חלק מזיכרון ראשי שמיועדת לשמירת נתונים באופן זמני בשלושה מקרים‪:‬‬
‫› ביצוע פקודות שמירה ‪PUSH -‬‬
‫› קריאה לתת‪-‬שגרות ‪procedure call -‬‬
‫› ביצוע פסיקות ‪interrupt execution -‬‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫הגדרת גודל המחסנית מתבצעת בהנחיה הבאה‪:‬‬
‫‪DW‬‬
‫)>‪<size of stack> dup(<initial value‬‬
‫לדוגמה‪:‬‬
‫‪Stack_Seg‬‬
‫‪SEGMENT‬‬
‫‪STACK‬‬
‫‪DW‬‬
‫)‪100h dup(0‬‬
‫‪Stack_Seg‬‬
‫‪ENDS‬‬
‫המחסנית נוצרת בזמן שהתוכנית עולה לביצוע לזיכרון הראשי‬
‫)‪ - Stack segment register (SS‬מקבל ערך התחלתי ממערכת הפעלה‬
‫)‪ - Stack pointer (SP‬קובע את ראש המחסנית בהתאם להגדרת המחסנית (‪) SP200h‬‬
‫רוחב המחסנית במעבד ‪ 8086‬מוגדר כ‪ , word -‬אי‪-‬אפשר לשמור נתונים בגודל ‪byte‬‬
‫שני אוגרים מצבעים באופן ברירת מחדל לתוך המחסנית ‪BP,SP:‬‬
‫› אוגר ‪ SP‬מושפע מכל פעולת גישה למחסנית באופן אוטומטי‬
‫› אוגר ‪ BP‬ניתן להצבעה חופשית בתוך המחסנית‬
‫אופן גישה למחסנית עם פקודות ‪Push,Pop‬‬
‫‪Pop Direction‬‬
‫‪ ‬פקודה ‪ Push‬מאחסנת נתון במחסנית‬
‫‪ ‬הפקודה מתבצעת בשני שלבים‪:‬‬
‫א‪SP  SP - 2 .‬‬
‫ב‪[SS:SP] data .‬‬
‫• פקודה ‪ Pop‬הוצא נתון במחסנית‬
‫• הפקודה מתבצעת בשני שלבים‪:‬‬
‫•א‪[SS:SP] data .‬‬
‫•ב‪SP  SP + 2 .‬‬
‫‪Push Direction‬‬
‫‪FFFFEh‬‬
‫‪top of stack‬‬
‫‪FFFFFh‬‬
‫‪SP=200h‬‬
‫‪SS‬‬
‫‪16 bit‬‬
‫‪00000‬‬
‫‪Main Memory‬‬
‫‪00001‬‬
‫פקודות קלט‪/‬פלט‬
‫•‬
‫כל התקן קלט‪/‬פלט מחובר למערכת המיקרופרוססור דרך פורטים בעלי כתובת גישה‬
‫מסוים‪ .‬סך הכול מרחב כתובות הוא ‪ FFFFh  0000‬אבל מנוצלים הרבה פחות‬
‫כתובות ‪ -‬תלוי במבנה המערכת‬
‫קליטת נתון בעל ‪ 8‬סיביות מפורט כניסה בכתובת בעלת ‪ 8‬סיביות; ‪IN AL, IN_PORT‬‬
‫קליטת נתון בעל ‪ 16‬סיביות מפורט כניסה בכתובת בעלת ‪ 8‬סיביות ; ‪IN AX, IN_PORT‬‬
‫טעינת אוגר ‪ DX‬בכתובת גישה לפורט אם הכתובת בעלת ‪ 16‬סיביות ; ‪MOV DX, IN_PORT‬‬
‫‪IN AL, DX‬‬
‫קליטת נתון בעל ‪ 8‬סיביות מפורט כניסה בכתובת בעלת ‪ 16‬סיביות ;‬
‫‪IN AX, DX‬‬
‫קליטת נתון בעל ‪ 16‬סיביות מפורט כניסה בכתובת בעלת ‪ 16‬סיביות ;‬
‫פליטת נתון בעל ‪ 8‬סיביות מפורט כניסה בכתובת בעלת ‪ 8‬סיביות ; ‪OUT IN_PORT, AL‬‬
‫פליטת נתון בעל ‪ 16‬סיביות מפורט כניסה בכתובת בעלת ‪ 8‬סיביות ; ‪OUT IN_PORT, AX‬‬
‫טעינת אוגר ‪DX‬בכתובת גישה לפורט אם הכתובת בעלת ‪ 16‬סיביות ; ‪MOV DX,OUT_PORT‬‬
‫‪OUT DX, AL‬‬
‫פליטת נתון בעל ‪ 8‬סיביות מפורט כניסה בכתובת בעלת ‪ 16‬סיביות ;‬
‫‪OUT DX, AX‬‬
‫פליטת נתון בעל ‪ 16‬סיביות מפורט כניסה בכתובת בעלת ‪ 16‬סיביות ;‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫פקודות אריתמטיות – חיבור( ‪)Addition‬‬
‫חיבור בין שני נתונים‬
‫חיבור בין שני נתונים ועוד סיבית הנשא‬
‫הוספת ‪ 1‬לתוכן האוגר או תא בזיכרון‬
‫‪Decimal adjust for addition‬‬
‫(הפקודה מתקנת את תוצאת החיבור בין שני מספרים בצופן ‪Package BCD‬‬
‫לצופן ‪ ) .Package BCD‬הפקודה מתבצעת כלפי אוגר ‪ AL‬בלבד‬
‫;‬
‫;‬
‫;‬
‫;‬
‫‪ADD dest, source‬‬
‫‪ADC dest, source‬‬
‫‪INC dest‬‬
‫‪DAA‬‬
‫‪; ASCII adjust for addition‬‬
‫‪AAA‬‬
‫(הפקודה מתקנת את תוצאת החיבור בין שני מספרים בצופן ‪ ASCII‬לצופן‬
‫‪ )Un-package BCD‬הפקודה מתלעת כלפי אוגר ‪ AL‬בלבד‬
Addition Example for Package BCD data
Data 1 DB 52H ;
Data 2 DB 89H ;
Result DW 0
; 0141H
…………………………..
52H
MOV AL, Data1
+ 89H
ADD AL, Data2
EBh
DAA

+ (6)(6)
MOV byte ptr RESULT,AL
0141H
ADC byte ptr
RESULT+1,0
Addition Example for ASCII data
Data 1 DB ‘8’
Data 2 DB ‘7’
Result DW 0
…………………………..
MOV AL, Data1
ADD AL, Data2
AAA
ADD AX,3030h
MOV RESULT,AX
;38H
;37H
; ’17’ = 3135H
38H
+37H
6Fh
; AX 0105H
; AX 3135H )’15’(
Addition Example – Sum of Block
BLOCK
OREH
RESULT
DW 8H, 407H, 1054H, 8DH, 4AC2H
DW 5
DD 0
-------------------------------------------------------------------
LEA SI, BLOCK
MOV CX,OREH
NEXT: MOV AX, [SI]
ADD WORD PTR RESULT,AX
ADC WORD PTR RESULT+2,0
INC SI
INC SI
LOOP NEXT
‫פקודות אריתמטיות – חיסור(‪)Subtraction‬‬
‫•‬
‫•‬
‫•‬
‫•‬
‫חיסור בין שני נתונים ; ‪SUB dest, source‬‬
‫חיסור בין שני נתונים עם מלווה ; ‪SBB dest, source‬‬
‫‪DEC dest‬‬
‫החסר ‪ 1‬מתוכן האוגר או תא בזיכרון ;‬
‫‪DAS‬‬
‫‪;Decimal adjust for subtract‬‬
‫(הפקודה מתקנת את תוצאת החיבור בין שני‬
‫מספרים בצופן ‪ BCD‬לצופן ‪)BCD‬‬
‫הפקודה מתבצעת כלפי אוגר ‪ AL‬בלבד‬
‫‪• AAS‬‬
‫‪;ASCII adjust for subtract‬‬
‫(הפקודה מתקנת את תוצאת החיבור בין שני‬
‫מספרים בצופן ‪ ASCII‬לצופן ‪)Un-package BCD‬‬
‫הפקודה מתלעת כלפי אוגר ‪ AL‬בלבד‬
‫‪• NEG dest‬‬
‫‪;dest<= - dest‬‬
‫השווה בין המקור לבין היעד ללא שינוי היעד ; ‪• CMP dest, source‬‬
‫הפקודה מעדכנת דגלים בהתאם לתוצאת ההשוואה‬
‫שני האופרנטים חייבים להיות באותו גודל‬
)MUL and DIV( ‫פקודות אריתמטיות – כפל וחילוק‬
• MUL {<register> | <memory>}; ‫כפל בין שני מספרים לא מסומנים‬
• IMUL {<register> | <memory>};2-‫כפל בין שני מספרים מסומנים בשיטה משלים ל‬
•
•
•
•
AX <= AL * source (source = 8 bit)
DX:AX <= AX * source (source = 16 bit)
DIV {<register> | <memory>} ; ‫חילוק בין שני מספרים לא מסומנים‬
IDIV {<register> | <memory>} ; 2-‫חילוק בין שני מספרים מסומנים בשיטה משלים ל‬
AL< = ‫( חלק שלם‬AX / source) , AH<=‫ ;שארית‬source = 8 bit
AX = ‫ ( חלק שלם‬DX:AX / source), DX <= ‫ ;שארית‬source = 16 bit
AAM
; Adjust AL for multiplication –
) ‫ בלבד‬AL ‫ אחרי הכפל (כלפי אוגר‬Un-package BCD ‫המרת מספר בינארי לצופן‬
AAD
;Adjust AX for division
) ‫ בלבד‬AL ‫ למספר בינארי לפני החילוק (כלפי אוגר‬Un-package BCD ‫המרת מספר בצופן‬
• CBW
• CWD
; convert byte to word for signed division
; convert word to double word for signed division
)MUL and DIV( ‫פקודות אריתמטיות – כפל וחילוק‬
• ‫הפקודה‬
1 ‫מכפיל‬
• MUL CL ;
• MUL BX ;
CL (byte) *
BX (word) *
•
‫הפקודה‬
‫מונה‬
• DIV CL ; AX
/
• DIV BX ; DX: AX /
2 ‫מכפיל‬
‫מחבה‬
AL
AX
‫תוצאה‬
=>
=>
‫חלק שלם‬
CL (byte) => AL
BX (word)=> AX
AX
DX : AX
‫ארית‬
AH
DX
‫פקודות קפיצה‬
• Unconditional Jump Instruction
• JMP {<address> | <label> | <register>}
o Long Jump in Code Segment–‫קפיצה ערוכה למקום כל שהוא במקטע פקודות‬
• Conditional Jump Instruction
• JXX {<address> | <label>}
o Short Jump Instructions –
‫ בתים ממקום‬128- 127+ ‫קפיצה קצרה להיסט‬
‫הפקודה‬
2 - ‫פקודות קפיצה עם תנאי‬
Arithmetic Jump
•
•
•
•
•
•
•
•
•
•
JS
Jump sign
S=1
JNS
Jump no sign S=0
JC
Jump carry
C=1
JNC
Jump no carry C=0
JO
Jump overflow O=1
JNO
Jump not overflow
O=0
JP / JPE
Jump parity even
P=1
JNP / JPO Jump parity oddP=0
LOOP
<label>
The LOOP instruction, which serves the above purpose, requires
an initial value in the CX register. It will decrement the CX
register and branches to the target location if the CX register
does not contain 0.
Push,Pop – ‫פקודות גישה למחסנית‬
5679h
Push Direction
FFFFF h
MSB
Mov AX,1234h
Mov BX,5679h
Push AX
Push BX
1234h
12
56
Pop Direction
FFFFE h
34
79
LSB
SP<=top of stack
next element
to be pushed
SS
16 bit
00001
MAIN MEMORY
00000
‫שיגרה‬-‫קריאה לתת‬
• CALL
<label>
• RET
<immediate>
• <procedure name> PROC {FAR | NEAR}
•
:
: ***your (main/ sub) program here***
»
RET (RET n)
• <procedure name> ENDP
• The CALL instructions take the same forms as the JMP instructions
• The return RET instruction returns control to the caller of a
subroutine. It does so by popping the return address off the stack
and transferring control to the instruction at the return address. Near
call returns pop a 16-bit return address off the stack into the IP
register. A far call returns pop a 16-bit offset into the IP register and a
16-bit segment value into the CS register.
CALL procedure
• The FAR CALL instruction does the following:
• .Pushes the CS register onto the stack.
• .Pushes the 16-bit offset of the next instruction following the
call onto the stack.
• .Copies the 32-bit effective address into the CS:IP register.
• .Execution continues at the first instruction of the subroutine.
• The NEAR CALL instruction does the following:
• .Pushes the 16-bit offset of the next instruction following the
call onto the stack.
• .Copies the 16-bit effective address into the IP register.
• .Execution continues at the first instruction of the subroutine.
Simple Logic Function
• . The instructions for Boolean logic are AND, OR, XOR, and NOT.
The syntax are:
•
•
•
•
•
AND {register| memory} , {register | memory | immediate}
OR {register| memory} , {register | memory | immediate}
XOR {register | memory} , {register | memory | immediate}
NOT {register | memory}
TEST { register | memory} , {register | memory | immediate}
The TEST Instruction executes the AND Operation without
changing the Destination Operand – only sets the Status
Flags (Zero Flag)
Rotate & Shift Instructions
• Commands Explanation
•
•
•
•
•
•
•
SHL {<register>, <memory>}, {1 | CL} ;Shift Left
SHR {<register>, <memory>}, {1 | CL} ;Shift Right
SAL {<register>, <memory>}, {1 | CL} ;Shift arithmetic left
SAR {<register>, <memory>}, {1 | CL}; Shift arithmetic right
ROL {<register>, <memory>}, {1 | CL};Rotation to left
ROR {<register>, <memory>}, {1 | CL};Rotation to right
RCL {<register>, <memory>}, {1 | CL}; Rotation through
carry bit left
• RCR {<register>, <memory>}, {1 | CL};Rotation through
carry bit right
Rotate & Shift Instructions
C
0
0
C
SHR
SHL/ SAL
C
C
ROL
ROR
C
C
RCR
RCL
0
C
SAR
String Operations
•
•
•
•
•
•
•
•
•
•
•
String - Array of characters (byte or word)
DS:SI - Source array
ES:DI - Destination array
DF (Direction Flag) indicates if SI and DI are to be incremented (0) or
decremented (1) after operation
Byte operations increment/decrement by 1; Word - by 2.
CLD/STD - Clear/Set DF flag
MOVSB / MOVSW - Move byte/word at DS:SI location to ES:DI location
LODSB / LODSW - Load AL/AX with byte/word at DS:SI location
STOSB / STOSW - Store byte/word from AL/AX to ES:DI location
CMPSB / CMPSW - Compare the two bytes/words
› Flags are set based on source (DS:SI) minus destination (ES:DI)
• SCASB / SCASW - Compare byte/word in AL/AX to that at location ES:DI
Repetitive String Operations
Repeat string operation using CX to indicate how many times
REP xx - where xx is a string operation
REPE / REPZ xx where xx is compare or scan; repeat xx until
CX = 0 or ZF=0 where ZF set by comparison.
REPNE / REPNZ xx - where xx is compare or scan; repeat xx
until CX = 0 or ZF =1 by comparison
Compare character by character:
STRNG1 DB 5 DUP(?)
STRNG2 DB 5 DUP(?)
MOV CX,5
LEA SI,STRNG1 ;STRNG1 in DS
LEA DI,STRNG2 ;STRNG2 in ES
REPE CMPSB
JE
EQL
JB
NEQL
EQL:
...
;What to do if two are equal
NEQ
...
;What to do if two are not equal
Interrupt Instruction
• Interrupts execution of a program so that system can take special
action.
› INT
<interrupt number>
• INT instruction calls the system routines and other special
subroutines (make a system call). The system supports a maximum
of 256 different interrupt service routines.
• The CPU provides a 256 entry interrupt vector table beginning at
address 0:0 in memory. This is a 1K table containing a 256 4-byte
entries. Each entry in this table contains a segmented address that
points at the interrupt service routine in memory. Generally, we will
refer to interrupts by their interrupt value, so interrupt INT 0 address
is at memory location 0:0, interrupt INT 1 address is at address 0:4,
etc.
Interrupt Types
•
•
•
•
•
There are 3 Different Types of Interrups:
1. System Interrupt ( Called by System – Divide 0 for example)
2. Software Interrupts ( Called by Instruction INT <n> -BIOS,DOS)
3. Hardware Interrupt ( Called by Interrupt Request from External
Source used Interrupt Controller by Intr Pin of the Microprocessor
Chip)
• The CLI (clear Interrupt Flag) instruction tells the assembler to prevent
any hardware interrupt from this point
• The STI (set Interrupt Flag) instruction allows any hardware interrupt
raised
Interrupt Execution
When an interrupt occurs, the CPU does the following:
•
•
•
•
•
•
•
1. The CPU pushes the flags register onto the stack.
2. The CPU pushes a far return address (CS:IP) onto the stack,
segment value first.
3. The CPU determines the interrupt number and fetches
four-byte interrupt vector from the correspondence address.
4. The CPU transfers control to the routine specified by
the interrupt vector table entry.
After the completion of the steps, the interrupt service routine
takes control. When the interrupt service routine wants to return
the control, it must execute an IRET (interrupt return)
instruction. The interrupt return, similar as RET instruction,
pops the far return address and the flags off the stack
Writing the Interrupt Service Routine - ISR
• The ISR has a very special restriction: they must preserve the
state of the CPU. In particular, these ISRs must preserve all
registers they modify. For example,
•
•
•
•
•
•
•
•
SimpleISR
PROC
FAR
AX
AX, 0
SimpleISR
PUSH
MOV
…
…
POP
IRET
ENDP
AX
BIOS Interrupts
BIOS interrupt: it uses the INT instruction to transfer the control directly to BIOS.
•
BIOS Interrupts service the simply IO Operations:
›
›
›
›
•
•
•
•
•
Video Display Services
-- INT 10h
Serial Port (COM) Services
-- INT 14h
Keyboard Read Services
– INT 16h
Timer and Real-Time Clock Services – 1Ah
Every Type( <n> ) of BIOS Interrupts provides the set of the Functions for
different IO operations.
The service number of the Function loaded to AH register for operation’s
definition
There are numbers of the functions which needed the Input Parameters
load to Processor Registers
There are numbers of the functions which return the Output Parameters
to Processor Registers
There are numbers of the functions which needed the Input Parameters
and return the Output Parameters
BIOS interrupt for Video Display INT 10h
•some service for screen handling, with different service number
Service No.
00h
02h
06h
08h
09h
0Ch
0Fh
Explanation
Set video mode
Set cursor position
Scroll window up
Read character and attribute at cursor position
Write character and attribute at cursor position
Write pixel
Get video mode
Text mode video
BIOS Interrupt Example
• Screen Window Creating ,Coloring and Scrolling using BIOS
interrupt INT 10h Service 06h
Registers
Input Parameter -Purpose
Initial Value
AH
Interrupt Service Code
06h
AL
Number of lines scrolled up
BH
Specify the color
CH
Starting row
Any value (Suggestion: 00 for full screen)
CL
Starting column
Any value (Suggestion: 00 for full screen)
DH
Ending row
Any value (Suggestion: 18h for full screen)
DL
Ending column
Any value (Suggestion: 4Fh for full screen )
00 for full screen, other constant for number of lines
See below
Internal structure for color definition - VGA Attribute Byte
B
r g b
7
6
5
4
blinking bit
Background color bits
I
3
r g b
2
1
0
Foreground color bits
r - red
g - green
b – blue
I - intencity
B - blinking
BIOS Interrupt Example
• This example would create a window at the center of the
• screen with its own parameters
• WINDOW PROC NEAR
MOV AH, 06h
MOV AL, 00h
MOV BH, 01000001b
;red/blue
MOV CX, 0A1Ch
;top coordinates
MOV DX, 0E34h
;lower coordinates
INT
10h
RET
WINDOW ENDP
DOS Interrupt - INT 21h
• DOS interrupt: it uses the INT instruction to transfer the control
directly to DOS. As DOS is portable to any PC machine, DOS
interrupt can be used in any I/O devices.
• Interrupt 21h provides some service for keyboard and screen
handling, with different service number.
• For Example:
Service No.
01h
02h
07h
08h
09h
0Ah
4Ch
Explanation
Keyboard input with echo
Display output
Keyboard input without echo (no check for Ctrl-C)
Keyboard input without echo (check for Ctrl-C)
Display string
Receive String from Keyboard
Terminate program – Return to DOS
DOS Interrupt Examples
•
Read a character from keyboard buffer & display the char on screen:
›
›
›
•
MOV
AH, 01h
INT
21h
AL<= ASCII Code of the pressed Key (Output Parameter)
Input a String from keyboard & display the string on screen:
DATA_SEG SEGMENT
NAMESTRING
DB
10, ?, 10 dup (?)
DATA_SEG ENDS
CODE_SEG SEGMENT
ASSUME
CS: CODE_SEG, DS: DATA_SEG
MOV
AH, 0Ah
LEA
DX, NAMESTRING
INT
21h
CODE_SEG ENDS
NAMESTRING[0] – Input Parameter – Max Number of The Characters in the String
NAMESTRING[1] – Output Parameter – Real Number or The Characters was pressed
NAMESTRING[2] – String Buffer Beginning for input string saving
‫ של תווים‬ASCII ‫טבלת‬
• CR = “carriage return” )Windows: move to beginning of line(
• LF = “line feed” )Windows: move directly one line below(
• SPC = “blank space”
‫הצגת מספרים עשרוניים בקוד ‪BCD‬‬
‫•‬
‫‪ – BCD format‬כל ספרה עשרונית ( ‪ ) 9 – 0‬מוצגת ע"י ‪ 4‬סיביות בינאריות‬
‫•‬
‫‪ - Unpackaged BCD format‬כל ספרה עשרונית ( ‪ ) 9..0‬מוצגת ע"י ‪1 byte‬‬
‫‪5 => 00000101b‬‬
‫‪58 => 00000101 00001000b‬‬
‫•‬
‫‪ - Packaged BCD format‬שתי ספרות עשרונית מוצגות ע"י ‪1 byte‬‬
‫‪58 => 0101 1000b‬‬
‫•‬
‫המרת נתון שהוא ספרה עשרונית מ‪Unpackaged BCD format -‬‬
‫ל‪ASCII format -‬‬
‫’‪5 => 00110000b+00000101b =00110101b = 35h=‘5‬‬
8086 CPU Block Diagram
I/0 AND MAIN MEMORY INTERFACE
+
BIU – Bus
Interface Unit
ES – Extra Segment
Addr generation
Bus Controller
6
5
4
CS – Code Segment
3
SS – Stack Segment
2
Instruction
Stream Byte
Queue
1
DS – Data Segment
IP –Instruction Pointer
OPCODE DECODER
INTERNAL BUS
AH
AL
BH
BL
CH
CL
DH
DL
SP
BP
SI
DI
ARITHMETIC – LOGIC UNIT
EU
Execution Unit
OPERANDS
FLAG REGISTER