590 likes | 814 Views
ארכיטקטורת מחשבים ומעבדת תכנות מערכות טל סובול שיקלר שעת קבלה: יום א', 9-10, 14-15 חדר: stal@bgu.ac.il. בשיעורים שעברו. מה למדנו. High-Level Languages, e.g. ML Compiled Languages, e.g. C++ Assembly Languages Programs Machine Code/ Architecture Computer Organization Level
E N D
ארכיטקטורת מחשביםומעבדת תכנות מערכותטל סובול שיקלרשעת קבלה: יום א', 9-10, 14-15חדר:stal@bgu.ac.il
מה למדנו High-Level Languages, e.g. ML Compiled Languages, e.g. C++ Assembly Languages Programs Machine Code/ Architecture Computer Organization Level Digital Logic Level Transistors & Layout Materials/ Physics √ √ Physical Layers
מונחים • ארגון המחשב מבנה המחשב – זיכרון, מעבד, BUSes, קלט-פלט מבנה המעבד – רגיסטרים ודגלים, יחידת ביצוע, יחידת בקרה • שפת מכונה קוד בינארי, המייצג את פקודות שפת המכונה וניתן לביצוע על-ידה Opcodes, operand & operation specifiers • ארכיטקטורה סט הפקודות של המכונה: סוגי פעולות, סוגי משתנים, הגדרת המשתנים, מבנה הפקודה, משאבים
הארכיטקטורה – סט הפקודות של המחשב תלויה בארגון המכונה, תלויה ביצרן סוגי המשתנים הנתמכים: תלוי בסוגי הרגיסטרים ב- 80x86 – סוגים, ייעודים, ואורכים שונים לרגיסטרים סוגי ומבני הפקודות: RISC או CISC ב- 80x86 – אורך הפקודה 1-17 בתים סט גדול מאוד של פקודות מספר מגוון של מאפייני פקודה ומאפייני משתנים בשל דרישת תאימות לאחור – מבנים שונים לאותה פקודה
שפת אסמבלי היא (כמעט) תרגום ישיר של שפת המכונה מרכיבי שפת אסמבלי (בשיעור שעבר): • גרסה סמלית של פקודות שפת המכונה - mnemonics • תוויות לייצוג קבועים וכתובות בזיכרון – labels • משתנים – גלויים ועקיפים, בגדלים שונים – operands
שיעור 4:1. שיטות מיעון2. שפות עיליות, פונקציות
Addressing modes • המידע הדרוש למימוש הפקודה ולשמירת תוצריה - מוגדר בפקודה • מוגדרת אחת משיטות המיעון השונות (addressing modes) • שיטות המיעון - תלויות מכונה • שמות השיטות - תלויים ביצרן • מידע יכול להישמר ברגיסטרים או בזיכרון • ברוב פקודות ה- :80x86לפחות אחד המשתנים חייב להיות רגיסטר או מיידי (immediate) לא כל שיטות המיעון, ולא כל שילוביהן מותרים עבור כל פקודה!
Addressing modes • Register • Immediate • Direct (absolute) • Register indirect • Displacement (offset) • Relative • Indexed • Indirect • Auto-increment/ auto-decrement • … כל שיטת מיעון מתאימה לסוג מסוים של גישה למידע (Common data access)
Register addressing • שימושים: משתנים או משתני ביניים • קוד מכונה: מספר ביטים בפקודה • אסמבלי: נקיבה בשם הרגיסטר דוגמאות: שפת מכונהאסמבלי 40 inc eax 43inc ebx
Immediate addressing • שימושים: קבועים • קוד מכונה: המשתנה חלק מהפקודה • אסמבלי: מספר דוגמה: שפת מכונהאסמבלי 050145 add ax, 0x4501 little endian!
ארגון הזיכרון רוב המידע מאוחסן בזיכרון הראשי שאלנו: • מהי היחידה הבסיסית אליה ניתן לפנות? בתים/מלים • כיצד מלים ממופות לבתים? Big endian / Little endian • מהו מרחב הכתובות? או מהם מרחבי הכתובות? 32 ביטים / Segmented
Absolute (direct) addressing • שימושים: משתנים פשוטים (גלובליים). בגלל הגישה לזיכרון – השיטה מהשיטות הקודמות. • קוד מכונה: כתובת המשתנה בזיכרון היא חלק מהפקודה • אסמבלי: הכתובת מופיעה כמספר או כ- Label (ב- NASM – בתוך סוגריים מרובעים, בשפות אסמבלי אחרות – ללא סוגריים) דוגמה: שפת מכונהאסמבלי inc word [my_string] FF060010 inc word [0x1000]
Absolute (direct) addressing שימושים: משתנים פשוטים (גלובליים) דוגמה: שפת C int x=0; x++; אסמבלי(עשוי להיכתב בצורה הבאה, בהתעלם מ- sections) x: dd 0 ; NOT a variable definition!!! inc dword [x]
Register indirect addressing • השיטה: המשתנה נמצא בזיכרון. כתובתו נמצאת ברגיסטר • שימושים: גישה ע"י מצביע – pointer(המצביע נמצא ברגיסטר) • אסמבלי: הכתובת מופיעה כרגיסטר בסוגריים מרובעים (הערה: ניתן להשתמש רק ברגיסטרים של 32 ביט) register memory add1 משתנה add1
Register indirect addressing • השיטה: המשתנה נמצא בזיכרון, כתובתו נמצאת ברגיסטר • שימושים: גישה ע"י מצביע – pointer(המצביע נמצא ברגיסטר) • אסמבלי: הכתובת מופיעה כרגיסטר בסוגריים מרובעים דוגמה: אסמבלי inc byte [ebx] אם הערך ב- ebx הוא 0x104 מגדילים ב-1 את ה-byte הנמצא בכתובת 0x104 בזיכרון
Register indirect addressing שימושים: גישה ע"י מצביע – pointer(המצביע נמצא ברגיסטר) רשימות של משתנים (arrays) דוגמה: שפת C *p = *p + 1; אסמבלי(בהנחה שהמצביע p נמצא ברגיסטר ebx) inc byte [ebx] כתובת המשתנה נקראת – כתובת אפקטיבית (EA - Effective Address) במסמכי אפיון - מציינים לעתים משוואה לחישובה. כאן: EA = [ebx]
Register vs. Register Indirect שימו לב: • Register addressing mode p++; inceax; • Register indirect addressing *p = *p+1; inc [eax];
Displacement addressing • השיטה: המשתנה נמצא בזיכרון. כתובתו מוזזת במרחק קבוע מהכתובת המוגדרת ע"י הרגיסטר:EA= [reg] + displacement • שימושים: גישה ל- structure • אסמבלי: מוגדר הרגיסטר ומרחק התזוזה register memory add1 add1 displacement משתנה
Displacement addressing • השיטה: המשתנה נמצא בזיכרון. כתובתו מוזזת במרחק קבוע מהכתובת המוגדרת ע"י הרגיסטר:EA= [reg] + displacement • שימושים: גישה ל- structure • אסמבלי: מוגדר הרגיסטר ומרחק התזוזה דוגמה: אסמבלי inc byte [ebx + 0x10] אם הערך ב- ebx הוא 0x104 מגדילים ב-1 את ה-byte הנמצא בכתובת 0x114 בזיכרון
Displacement addressing שימושים: גישה ל- structure דוגמה: שפת C structfoo {int x; int y; char z;}; p = & foo; /* assume correct type */ p -> z++; אסמבלי movebx, [p] inc byte [ebx + 8]
Relative addressing • השיטה: המשתנה נמצא בזיכרון. כתובתו מוזזת במרחק קבוע מהכתובת המוגדרת ע"י מונה התוכנית (PC):EA= [PC] + displacement • שימושים: קפיצה מותנית, קוד שאינו תלוי מיקום • אסמבלי: מוגדר מרחק התזוזה כמספר או כ- Label דוגמה: שפת מכונהאסמבלי 7502jnz next ; =jnz $+4 6640 inc eax 66F7D8 next: negeax
Indexed addressing (with displacement) • השיטה: EA= myarray+reg*index • שימושים: גישה למערך (Array) • אסמבלי: מוגדר רגיסטר, כופל (1, 2, או 4) וכתובת בסיס (מחושב בבתים) register register x index myarray משתנה
Indexed addressing (with displacement) • השיטה: EA= reg*index + displacement • שימושים: גישה למערך (Array) • אסמבלי: מוגדר רגיסטר, כופל (1, 2, או 4) וכתובת בסיס (מחושב בבתים) דוגמה: inc dword [myarray + ebx*4] אם הערך של ebx הוא 5, מעלים את ערך המלה הכפולה הנמצאת בכתובת myarray+20 בזיכרון.
Indexed addressing (with displacement) השיטה: EA= reg*index + displacement גרסאות: ללא Displacement inc dword [ebx*4] Indexed עם Indirect inc dword [ebx*4 + eax] Indexed עם IndirectןעםDisplacement inc dword [myarray + ebx*4 +eax]
לעתים עדיף לא להשתמש בשיטה זו: לא תמיד נשתמש בכל החישוב, עבור כל איבר למשל בתמונות ניתן להתקדם לאורך שורה ע"י +1 ניתן להתקדם לאורך עמודה ע"י + רוחב שורה
Auto-increment & Auto-decrement שיטה: Auto-increment לאחר הפעולה Auto-decrement לפני הפעולה 680x0 Assembly:קידום הפוינטר לפני או אחרי הגישה MOVI.B #5, -(A7) ; decrement pointer then move immediate 5 MOVI.B (A7)+, D0 ; increment pointer then move to D0 שפת C: c=*p++;
Auto-increment & Auto-decrement 80x86 Assembly:מימוש המחסנית push 5 חיקויים של 80x86 (לא במקורי): mov –[esp], 5
Double indirect addressing modes שיטה:המשתנה נמצא בכתובת המוגדרת ע"י המידע הנמצא במקום בזיכרון עליו מצביע הרגיסטר VAX: inc *(r1) קיימות שיטות נוספות – מסובכות יותר ופחות אנו לא נעסוק ב- memory segments r1 add1 add1 add2 add2 משתנה
סיכום ביניים • שיטת המיעון מוגדרת בפקודה • שיטות המיעון - תלויות מכונה • מידע יכול להישמר ברגיסטרים או בזיכרון • לא כל שיטות המיעון, ולא כל שילוביהן מותרים עבור כל פקודה! • רוב המידע מאוחסן בזיכרון הראשי • 80x86/Linux: גישה לבתים מיפוי מלים לפי little endian מרחב כתובות232
Addressing modes • Register inc eax • Immediate add ax, 0x4501 • Direct (absolute) inc word [0x1000] • Register indirect inc byte [ebx] • Displacement (offset) inc byte [ebx + 0x10] • Relative jnz next • Indexed inc dword [myarray + ebx*4] • Indirect • Auto-increment/ auto-decrement • … כל שיטת מיעון מתאימה לסוג מסוים של גישה למידע
Addressing modes 32 bit addressing modes
פרוצדורות, פונקציות ומנשקים לשפות עיליות
במה נעסוק • למה וכיצד יוצרים תכניות מודולאריות • כיצד מתממשקים עם שפות עיליות, כדוגמת C • פרוצדורות ופונקציות • סוגי מידע ודרכים לשמירת ולהעברת מידע • Activation frame • Calling conventions • העברת ערך • העברת כתובת • מחסנית אסמבלי, C, ועוד
פונקציות ופרוצדורות פונקציות ופרוצדורות – דוגמאות לתת-תכניות בשפות עיליות פרוצדורות – לא מחזירות ערך, אינן חייבות להסתיים פונקציות – פרוצדורות המחזירות תוצאה התכנית הקוראת (לפרוצדורה/פונקציה) והפרוצדורה /פונקציה חייבות להסכים על צורת העברת המידע ביניהן. Calling convention - "הכללים המוסכמים" להעברת המידע
פונקציות ופרוצדורות X0,X1, Y0 שרטוט קו אופקי X0- X1, Y0 שרטוט קו אופקי Xi- Xj, Yk CALL X0,X1, Y1 שרטוט קו אופקי X0- X1, Y1 CALL X0,Y0, Y1 שרטוט קו אנכי X0, Y0 – Y1 שרטוט קו אנכי Xn, Ym – Yl CALL שרטוט קו אנכי X1, Y0 – Y1 X0,Y0, Y1 מודולאריות: חלקי תכנית המבצעים פעולות מוגדרות ניתנים לשימוש חוזר ע"י קריאה מחלקים שונים לאורך התכנית CALL
אחסון מידע בשפות עיליות סוגים שונים של אחסון מידע: • משתנים גלובליים (global variables) • משתנים מקומיים (local variables) • פרמטרים/ארגומנטים של פונקציות/פרוצדורות • הערכים המוחזרים • Dynamically allocated data
משתנים גלובליים משתנה גלובלי - משתנה המוגדר בד"כ בתחילת התכנית והיכול לשמש בכל חלקיה. לכל משתנה גלובלי יכולה להיות כתובת קבועה בזיכרון. ב-C: int x=40; באסמבלי: X DD 40 • הכתובת של X בזיכרון תלויה בערך המונה כשמעבדים שורה זו. • זה לא משתנה!!! אין בדיקת type בכתיבה. ניתן "לדרוך" על מקום זה.
משתנים מקומיים משתנים מקומיים – משמשים בחלקים מסוימים של התכנית בלבד. ערכים ומשתנים מקומיים זקוקים לשם ייחודי כדי למנוע התנגשויות. ב-C: x=foo(x, &y); קריאה לפונקציה foo(int a, int *b){ int c= *b; return(c) } הפונקציה ערך מוחזר
ניתן להפעיל תת-תכנית ע"י קפיצה (JMP) • החזרה בעייתית מה קורה אם כתובת החזרה קבועה? הפונקציה חוזרת תמיד לאותו מקום בקוד • לא ניתן לקרוא לפונקציה/פרוצדורה ממקומות שונים בתכנית • לא ניתן לבצע רקורסיה • לא ניתן לבצע threading
Activation frame Activation frame- מסגרת המאותרת עבור כל הפעלה של פונקציה. כוללת: • כתובת חזרה • מצבי מכונה נוספים (דגלים) • ארגומנטים של הפונקציה • משתנים מקומיים • בשפות מסוימות – nested scope כיצד? הפתרון הפשוט – לשמור את המסגרת במחסנית.
Calling conventions כיצד קוראים לפונקציה? אפשרות 1 (באסמבלי): • ארגומנטים - ברגיסטרים מוסכמים • ערכים מוחזרים - ברגיסטר מוסכם (או אפילו בדגלים) • מהירות אופטימאלית (במקרים רבים) • קשה להכליל • לא ניתן להעברה • מספר הרגיסטרים קטן
Calling conventions כיצד קוראים לפונקציה? אפשרות 2: • ארגומנטים - במחסנית • ערכים מוחזרים – ברגיסטרים • די מהיר • ניתן להעברה במידה סבירה • מתאים לשפות עיליות עם ערך מוחזר יחיד ברוב הקומפיילרים של C
Calling convention for C 1. מה מעבירים לפונקציה? Call by value – השיטההפשוטה והכללית בשפות עיליות: • מספר משתנה של ארגומנטים - במחסנית • ערכים מוחזרים – ברגיסטרים • מאפשרת מספר משתנה של ארגומנטים
Call by value 2. PUSH • הערכים נדחפים למחסנית בסדר הפוך • לכן: הארגומנט הראשון תמיד בראש המחסנית TOS • מה קורה אם הפונקציה מצפה ל-k ארגומנטים, אבל קוראים לפונקציה עם n ארגומנטים, ו- n>k? • הפונקציה תעבוד כראוי, ולא תתייחס כלל לארגומנטים המיותרים • מה עושים אם רוצים לתמוך במספר משתנה של ארגומנטים (nargs)? • דוחפים את מספר הארגומנטים אחרי הארגומנט השמאלי ביותר
Call by value 3. ערכים מוחזרים - ברגיסטרים • אינטל 80x86: • AL, AX, EAX • מוטורולה 680x0: • D0 – למידע (data), A0 – למצביע (Pointer) • VAX: • r0
תזכורת: המחסנית מקום בזיכרון המשמש לאחסון זמני של data וכתובות • גודל כל "תא" 16 או 32 ביט (word / dword) • ESP מצביע על ה- Byte התחתון של הערך האחרון שנכנס • גודל המחסנית (במקרה שלנו) 232 • PUSH • POP
PUSH & POP PUSH • כיוון ה- stack pointer למקום המתאים, בהתאם לגודל האופרנד/המשתנה esp=esp-2) או (esp=esp-4 • הכנסת הערך החדש לפי – little endian כך ש- esp מצביע על ה- byte התחתון POP • הוצאת הערך מהמחסנית • העלאת ה- esp בהתאם לגודל האופרנד
CALL & RET • CALL • קפיצה בלתי-מותנית לתת-התכנית • PUSH לכתובת הפקודה הבאה • RET • POP של הכתובת • ביצוע הפקודה הבאה חשוב לנהל נכון את המחסנית כדי שהתכנית תתקדם כפי שאנו רוצים!!!