Download presentation
Presentation is loading. Please wait.
1
תכנות מתקדם בשפת סף שיטות מיעון ומבני נתונים
מצגת 5 פרק 6
2
נושאים שיטות מיעון ומבני נתונים עיבוד מחרוזות פרוצדורות
קלט פלט ופסיקות מקרו
3
שיטות מיעון הוראה בשפת סף מגדירה קבוצה של הוראות בשפת מכונה שבהן הפעולה זהה מתבצעת על סוגים שונים של אופרנדים. האופרנדים מציינים את אופן הגישה לנתונים עליהם מתבצעת הפעולה והם יכולים להיות מאוחסנים: בהוראה עצמה (נתון), באוגר או בזיכרון. בתהליך תרגום של ההוראה משפת סף לשפת המכונה, מופקת הוראת מכונה מתאימה לפעולה ולסוג האופרנדים הכלולים בה. לדוגמה, ההוראה MOV AL, AH מתורגמת להוראת מכונה 8AC4 וההוראה MOV AL , x , כאשר ההיסט של משתנה x הוא 0, מתורגמת להוראת מכונה A00000.
4
שיטות מיעון השיטות השונות לציון האופרנדים בהוראה, נקראות שיטות מיעון (Addressing modes). עד כה השתמשנו בשלוש שיטות מיעון שונות: מיעון מיידי בו אופרנד המקור הוא נתון ואופרנד היעד הוא אוגר, לדוגמה MOV AL, 10h מיעון אוגר בו הואפרנדים הם אוגרים, לדוגמה: MOV AL, AH מיעון ישיר בו אחד מהאופרנדים הוא משתנה בזיכרון, לדוגמה: MOV AL, var1 שיטות המיעון שהצגנו עד כה אפשרו עיבוד מוגבל של מבני נתונים והתייחסו למשתנים בלבד. במעבד 8086 קיימות שיטות נוספות המאפשרות גישה גם למבני נתונים מורכבים כמו: מצביעים, ערכים, רשומות, מחרוזות וכדומה
5
שיטת המיעון משפיעה לא רק על אופן הגישה לנתון, אלא גם על אורך ההוראה ועל זמן ביצועה. כדי להבין עקרון זה נחזור ונתאר את מחזור הבאה-ביצוע של הוראה הכולל את הפעולות הבאות: באילו פעולות יש גישה לזיכרון: גישה לזיכרון לקריאה הוראה קריאת הוראה ארוכה הוא ארוך יותר גישה לזיכרון לקריאת נתון טיפוס גדול יותר יותר זמן גישה גישה לזיכרון לכתיבת נתון מחזור הבאה-ביצוע קריאת ההוראה לביצוע וקידום מונה תכנית IP פענוח ההוראה במידת הצורך, קריאת אופרנדים המאוחסנים בזיכרון ביצוע ההוראה אחסון תוצאה כאשר פעולות 1-3 מתארות את תהליך ההבאה ופעולות 4-5 את תהליך הביצוע. בכל גישה לזיכרון ניתן לקרוא עד מילה אחת הערה: מספר מחזורי מכונה לביצוע הוראה תלוי בגורמים נוספים שאליהם לא נתייחס. הכוונה לתת סדר גודל/מדד איכותי לטיב התכנית מבחינת זמן הביצוע
6
דוגמאות להוראות אורך ומספר מחזורי מכונה
7
דוגמאות להוראות אורך ומספר מחזורי מכונה
8
שיטות מיעון 8086
9
מיעון מיידי Immediate addressing
בשיטת המיעון המיידי, הנתון הוא חלק מהגדרת ההוראה, לדוגמה: MOV AL, 10h MOV CX, 0FFh בשיטת מיעון זו הנתון יכול להיות אופרנד מקור בלבד (אופרנד היעד הוא אוגר). זמן ביצוע הוראה זו הוא קצר בדרך כלל משום שהנתון נקרא בפעולה הראשונה של שלב ההבאה כחלק מהוראה עצמה. משתמשים בגישה זו כדי לאתחל משתנים, לאתחל מונים של לולאה וכדומה.
10
מיעון אוגר Register addressing
בשיטת מיעון זו, האופרנדים הם אוגרים. הוראה יכולה להכיל אופרנד אחד שהוא אוגר, לדוגמה: INC AX או שני אופרנדים שהם אוגרים: ADD AL, AH ביצוע של הוראות בשיטת מיעון זו הוא מהיר יחסית משום שבשלב ההבאה יש גישה רק כדי לקרוא את ההוראה עצמה (פעולה ראשונה בתהליך ההבאה). שימושים: כדי לקצר זמן ביצוע של תכנית, נעדיף בדרך כלל, להשתמש במיעון אוגרים ולבצע את הפעולות הדרושות על האוגרים. אולם מאחר שמספר האוגרים למטרות כלליות במעבד הוא קטן, לא תמיד ניתן לאחסן את כל משתני התכנית באוגרים. במקרים אלו נעדיף לאחסן באוגרים נתונים המאוחסנים במשתנים אליהם פונים פעמים רבות במהלך ביצוע התכנית.
11
מיעון אוגר Register addressing
אולם מאחר שמספר האוגרים למטרות כלליות במעבד הוא קטן, לא תמיד ניתן לאחסן את כל משתני התכנית באוגרים. במקרים אלו נעדיף לאחסן באוגרים נתונים המאוחסנים במשתנים אליהם פונים פעמים רבות במהלך ביצוע התכנית. לדוגמה, בקטע אלגוריתם הבא: שים a=4 שים b=3 לכל i מ- 1 עד 100 בצע a = a+2 b = b +1 במהלך ביצוע הלולאה נגשים למשתנים a, b ו- i פעמים רבות (100 פעמים), ולכן נעדיף לאחסן משתנים אלו באוגרים ובאמצעותם נבצע את הוראות בגוף הלולאה. בסיום הלולאה נאחסן את התוצאות בזיכרון.
12
מיעון אוגר Register addressing
mov al, a ; העתקת נתונים מזיכרון לאוגרים mov bl, b ; AL = 4, BL=3 mov cx, 100 ; אתחול מונה לולאה ; גוף הלולאה again: ADD al, 2 ; AL=AL+2 INC bl ; BL = BL +1 LOOP again ; endloop ; endloop ; העתקת תוצאות לזיכרון mov a , al ; a =AL mov b, bl ; b = BL
13
מיעון זיכרון מיעון זיכרון מגדיר קבוצה של שיטות מיעון בהן אחד מהאופרנדים בהוראה הוא מתאר כתובת בזיכרון. את שיטות מיעון זיכרון ניתן לחלק לשתי קבוצות עיקריות: מיעון ישיר בו האופרנד כולל את כתובת המשתנה בזיכרון בצורה מפורשת מיעון עקיף בו כתובת תא בזיכרון המכיל את הנתון הדרוש מחושב בצורה עקיפה.
14
מיעון ישיר Direct addressing mode
בשיטת המיעון הישיר אחד מהאופרנדים בהוראה מכיל את כתובת של נתון המאוחסן בזיכרון, עליו תתבצע ההוראה. כתובת של נתון יכולה להיות נתונה על ידי ציון של שם משתנה או בצורה מפורשת ככתובת בזיכרון. לדוגמה, נניח כי היסט של משתנה a במקטע הנתונים הוא 1234h, שתי ההוראות הבאות מעתיקות את תוכן משתנה a לאוגר AX והן תתורגמנה לאותה כתובת בזיכרון: MOV AX, a MOV AX, DS:[1234h]
15
מיעון ישיר Direct addressing mode
MOV AX, DS:[1234h] ההוראה השנייה מכילה רישום מפורש של הכתובת של המשתנה a ומשמעותה: העתק את הנתון מכתובת הנמצאת בהיסט של 1234h בתים מכתובת תחילת סגמנט DSאל אוגר AL. בדרך כלל, שימוש בצורה המפורשת [ DS:[offset אינו מומלץ משתי סיבות: בזמן כתיבת התכנית אנו לא יודעים את הכתובת בה יאוחסן הנתון ולכן יהיה עלינו לחשב באופן ידני את ההיסט של הנתון שימוש בשם משתנה מסייע גם להבין את התפקיד שלו בתכנית ולכן משפר את הקריאות שלה. בתרגיל מעבדה מס. 2 בה התבקשנו להעביר נתון מטיפוס מילה כפולה לאוגר, יכולנו להעתיק את המילה העליונה לאוגר AX ואת המילה התחתונה לאוגר BX mov ax, DS:[0000] mov bx, DS:[0002] אפשר לא נוח להתייחס לכתובת של משתנה בצורה מפורשת. יש דרכים טובות יותר
16
מיעון ישיר Direct addressing mode
זמן ביצוע הוראות בשיטת מיעון ישיר ארוך יותר מאשר ביצוע אותה הוראה במיעון מיידי או מיעון אוגר כי: יש שתי גישות לזיכרון במחזור הבאה וביצוע: גישה אחת המתבצעת בפעולה הראשונה לקריאת ההוראה עצמה, גישה שניה המתבצעת בפעולה השלישית כדי לקרוא את הנתון עצמו (במידה והאופרנד הוא אופרנד מקור) תתכן גישה שלישית בפעולה החמישית כדי לכתוב את הנתון בזיכרון (במידה והאופרנד הוא אופרנד היעד). כמו כן ההוראות עצמן הן לפעמים ארוכות יותר (ולכן נדרשים יותר מחזורי קריאה) משום שכתובת היא 16 סיביות (בעוד שקידוד של אוגר יכול להיות 8 סיביות)
17
מיעון ישיר Direct addressing mode
נשנה את הוראות התכנית שהצגנו בסעיף הקודם ונשתמש במיעון ישיר: mov cx, 100 ; אתחול מונה לולאה ; גוף הלולאה again: add a, 2 ; a=a+2 inc b ; b = b +1 loop again ; endloop חסכנו הוראות להעתק תוכן משתנים לאוגרים al, bl והוראות לכתיבת התוצאות במשתנים a ו- b, אבל הוראות אלו מתבצעות רק פעם אחת
18
השוואה בין שימוש בשיטת מיעון אוגר למיעון מיידי
נבחן את מספר הגישות לזיכרון בביצוע ההוראות בגוף הלולאה (100 פעם): במיעון מיידי: 3 גישות לזיכרון: לקריאת הוראה, לקריאת ערך משתנה ולכתיבת תוצאה add a, 2 ; 17 מחזורי מכונה inc b ; 15 מחזורי מכונה במיעון אוגר: גישה אחת (לקריאת ההוראה) בביצוע ההוראות add al, 2 ; 4 מחזורי מכונה inc bl ; 2-3 מחזורי מכונה
19
מיעון עקיף במיעון עקיף כתובת הנתון בזיכרון נרשם בצורה עקיפה, בניגוד למיעון הישיר בו מציינים בצורה מפורשת את כתובת המשתנה יתרונות: התייחסות לכתובת בצורה עקיפה מאפשרת לבצע חישובים על כתובות וכך, מתאפשרת הגישה לקבוצה של תאי זיכרון המוגדרת כמבנה נתונים. בקבוצה זו יש מספר שיטות מיעון שונות:
20
מיעון עקיף Indirect Addressing Register
בשיטת מיעון זו, כתובתו של האופרנד מאוחסנת באחד מהאוגרים הבאים: BX, BP, SI , DI. לדוגמה, בהוראה MOV AL , [BX] הסימול [ ] סביב האוגר BX מציין שהאוגר מצביע על כתובת של נתון המאוחסן בזיכרון ולא מכיל נתון. משמעות ההוראה היא: העתק את הנתון עליו המאוחסן בכתובת עליו מצביע אוגר BX לאוגר AL. MOV BX, 1000h בדוגמה: הנתון שנמצא בהיסט 1000h יועתק לאוגר BX
21
מיעון עקיף Indirect Addressing Register
שימו לב: בשיטת מיעון זו ניתן להשתמש רק באוגרים BX, SI, DI, BP ולכן ההוראה הבאה: ADD AX, [CX] שגיאה;!!! אינה חוקית. ארבעת האוגרים שמצביעים על כתובת תא בזיכרון, מכילים את כתובת יחסית ההיסט ביחס לאוגר מקטע, כאשר: האוגרים BX, SI, DI מציינים את ההיסט יחסית לאוגר סגמנט הנתונים - DS ואילו אוגר BP מכיל היסט יחסית לסגמנט המחסנית- SS (עליו נרחיב את ההסבר בהמשך).
22
מיעון עקיף Indirect Addressing Register
כיצד מאתחלים אוגר לכתובת? ההוראה MOV BX, a מעתיקה נתון לאוגר BX ולא את כתובתו של a ההוראה LEA (Load Effective Address) LEA register, address משמעותה: טען את הכתובת של תא בזיכרון לתוך אוגר מצביע בן 16 סיביות. להוראה זו, כמו שאר הוראות מקבוצת הוראות העברה, אין השפעה על אוגר הדגלים ואופרנד היעד חייב להיות אוגר בן 16 סיביות. לדוגמה, ההוראה: LEA BX, a מעתיקה לאוגר BX את הכתובת של משתנה a. דרך נוספת היא להשתמש באופרטור offset לפני שם המשנה MOV BX, offset a האופרטור offset מעביר לאוגר BX את ההיסט של המשתנה a , או את מספר הבתים מתחילת מקטע הנתונים. ההבדל: ב- LEA חישוב כתובת מתבצע בזמן ריצה ושימוש ב- offset בזמן התרגום
23
מיעון עקיף Indirect Addressing Register
שימוש: פניה למשתני זיכרון שכתובתם מחושבת לדוגמה נשווה בין שני משתנים .data a DB 01 b DB 02 נשתמש בכתובת של משתנה a כדי לחשב את כתובתו של משתנה b : LEA BX, a ; BX = a כתובת של משתנה MOV AL, [BX] ; AL = a INC BX ; b חישוב כתובת משתנה CMP AL, [BX] ; if a = b ? חישוב כתובת b במיעון עקיף מתבצעת מהר יותר (מאשר שימוש בגישה ישירה) משום שזו פעולה המבוצעת באמצעות האוגר BX ולכן לא דורשת גישה לזיכרון (מעבר לגישה הדרושה לקריאת ההוראה עצמה).
24
עמימות בגישה לזיכרון MOV [BX], 0FFh
לעיתים ההוראה עצמה לא מספקת מידע חד משמעי על טיפוס תא זיכרון עליו מצביע האוגר, ובמקרה כזה נקבל שגיאת הידור. לדוגמה כאשר רושמים את ההוראה: MOV [BX], AL אופרנד המקור הוא מטיפוס בית, ובהתאם המהדר מפענח את ההצבעה [BX] לנתון מטיפוס בית. אולם כאשר רושמים את ההוראה MOV [BX], 0FFh הכתובת [BX] לא מלמדת על הטיפוס של הנתון ולכן המהדר לא יכול לדעת אם יש לאחסן את הנתון FFh בתא זיכרון מטיפוס בית או בתא זיכרון מטיפוס מילה.
25
עמימות בגישה לזיכרון כדי לאכוף טיפוס נתונים מסוים משתמשים באופרטור PTR שיכול להיות אחד משני הסוגים: byte PTR לציון בית word PTR לציון מילה לדוגמה, MOV byte PTR [BX], 0FFh ; כאל בית BX מתייחס לטיפוס נתון עליו מצביע MOV word PTR [BX], 0FFh ; כאל מילה BX מתייחס לטיפוס נתון עליו מצביע
26
עמימות בגישה לזיכרון ניתן להשתמש באופרטור זה כדי לאכוף פניה לבית אחד מתוך מילה, לדוגמה נגדיר משתנה מטיפוס מילה לדוגמה, נתון b DW 1234 ההוראה הבאה מעתיקה לאוגר AH את הבית העליון של משתנה b: MOV AH, byte ptr b+1 ; AH = 12 מעבדה 2 תרגיל 1.ג., כתבו קטע של תכנית המסכם 2 משתנים מטיפוס מילה כפולה
27
יישום משתנה מטיפוס מצביע
שיטת מיעון זו מאפשרת לממש טיפוס נתונים מצביע (pointer): מצביע הוא משתנה המכיל מען (כתובת) של משתנה אחר הנמצא בזיכרון. נגדיר מצביע בצורה הדומה להגדרת משתנה המכיל נתון. משתנה מטיפוס מצביע צריך להיות מטיפוס מילה משום שכתובת היא בת 16 סיביות. לדוגמה נגדיר מצביע p המצביע למשתנה a (מכיל את הכתובת של משתנה a) ומצביע נוסף q שאינו מאותחל a db b dw p dw a ; a מצביע ל- p q dw ? ; מצביע לא מאותחל q לכאורה ההצהרה על מצביע p נראית מוזרה, אולם אם נזכור כי שם משתנה הוא שם לוגי של כתובת ובזמן תרגום ההוראה לשפת מכונה, מוחלף שם המשתנה בהיסט (כתובת אפקטיבית) של המשתנה במקטע הנתונים, אזי ברישום ההצהרה p dw a
28
יישום משתנה מטיפוס מצביע
לכאורה ההצהרה על מצביע p נראית מוזרה, אולם אם נזכור כי שם משתנה הוא שם לוגי של כתובת ובזמן תרגום ההוראה לשפת מכונה, מוחלף שם המשתנה בהיסט (כתובת אפקטיבית) של המשתנה במקטע הנתונים, אזי ברישום ההצהרה p dw a מוקצה מקום בזיכרון למשתנה p שהוא מטיפוס מילה והוא מאותחל לכתובת אפקטיבית של משתנה a. בדוגמה שתיארנו אם כתובת אפקטיבית של a היא 0000, אזי p מאותחל לערך זה. נתאר מספר הוראות בהן נשתמש במצביע: כדי להשתמש במצביע, עלינו להעתיק את הכתובת המוצבעת לאוגר מצביע. ביצוע שתי ההוראות הבאות זהה MOV BX, p ; BX = p =0001 LEA BX, a ; BX = 0001 נשתמש בהצבעה כדי להעתיק את תוכן המשתנה a למשתנה x. לשם כך עלינו לרשום שתי הוראות: MOV AL, [BX] ; AL = 0ACh MOV x, AL ; x= a כדי לשים שמצביע q יצביע על אותו משתנה עליו מצביע p, נשתמש בהוראה: MOV q, BX ; q=p=0001 בסיום משתנה p ומשתנה q מצביעים על אותו משתנה, המשתנה a
29
יישום משתנה מטיפוס מצביע
30
מיעון אינדקס Direct Indexed Mode
בשיטת מיעון זו, הכתובת האפקטיבית של נתון מתקבלת על ידי חיבור של ההעתק המופיע בהוראה לערכו של אוגר מצביע: העתק + אוגר מצביע = כתובת הנתון נתאר תחילה את התחביר של שיטה זו: אוגר המצביע יכול להיות אחד מאוגרי האינדקס : SI ו-DI והכתובת היא היסט יחסית לאוגר מקטע הנתונים DS. ההעתק הוא מספר עם סימן בגודל בית או מילה. לרישום הוראה בשיטה זו יש שתי צורות: MOV AL, [SI+2] MOV AL, 2[SI] שתי הוראות אלה הן זהות ובהן מועתק הבית שכתובתו היחסית היא SI+2 לאוגר AL. הערה: באיור להחליף BX ב- SI או DI
31
מיעון אינדקס Direct Indexed Mode
נציג מספר דוגמאות נוספות לרישום הוראות בשיטת מיעון זו: שימו לב, תוכן האוגרים SI ו- DI אינו משתנה בעקבות הוראה זו.
32
מיעון אינדקס Direct Indexed Mode מערך חד-ממדי
הצהרה על מערך חד-ממדי כדי להצהיר על מערך חד-ממדי רושמים שם מערך(שם משתנה), טיפוס של איבר במערך ולאחריו ניתן לרשום את הערכים שיושמו במערך לאחר אתחולו, לדוגמה: a DW 100,7,0,3,12 אתחול מערך בו 5 איברים בגודל מילה הנחית אסמבלר זו שקולה להצהרה ואתחול מערך ששמו a ומצייני איבריו הם מ- 0 עד 4,
33
מיעון אינדקס Direct Indexed Mode מערך חד-ממדי
הצהרה על מערך חד-ממדי ניתן כמובן להצהיר על מערך חד-ממדי מבלי לאתחל את איבריו ולשם כך משתמשים בהנחיית אסמבלר הבאה: a DB 8 dup (?) בהצהרה זו הגדרנו מערך חד-ממדי ששמו a ובו 8 איברים שמצייניהם הם מ- 0 עד 7. ובאופן דומה ההצהרה הבאה: a DW 100 dup (10 ( מגדירה מערך בן 100 איברים מטיפוס מילה , המותחלים כולם לערך 10 ומצייני האיברים הם מ- 0 עד 99.
34
מיעון אינדקס Direct Indexed Mode מערך חד-ממדי
גישה לאיבר במערך חד-ממדי כדי להעתיק איבר במערך, עלינו לחשב את ההיסט של האיבר מכתובת תחילת המערך. בצורה כללית כדי לחשב כתובת של האיבר a[i] במיעון אינדקס נרשום: ההעתק המציין כתובת תחילת המערך אוגר האינדקס מציין את ההיסט של האיבר i מתחילת המערך והוא מחושב כ: i * גודל טיפוס איבר כאשר מציין לאיבר הראשון במערך הוא 0. לדוגמה, כדי להעתיק את האיבר הרביעי במערך a שאיבריו הם מטיפוס בית לאוגר AL, נרשום : MOV SI, 3 MOV AL, a[SI] ובאופן דומה כדי להעתיק את האיבר הרביעי במערך a שאיבריו הם מטיפוס מילה לאוגר AX, נרשום : MOV SI, 2*3 MOV AX, a[SI]
35
מיעון אינדקס Direct Indexed Mode מערך חד-ממדי
גישה לאיבר במערך חד-ממדי באופן דומה, נבצע את ההשמה:a[3] = a[2] ובהתאם נרשום את ההוראות הבאות: MOV SI, 1 ; מצביע על האיבר השני SI MOV AL, a[SI] ;ALהעתק את האיבר השני לאוגר INC SI ; חשב את הכתובת של האיבר השלישי MOV a[SI], AL ; לאיבר השלישי ALהעתק את אוגר שימו לב, במידה והערך המושם באוגר SI חורג מגבולות המערך, לא נקבל הודעת שגיאה (אלא אם כן נפנה לאזור בזיכרון שאליו אנו לא מורשים לפנות ועל כך נרחיב בפרק האחרון) וביצוע התכנית ימשיך כרגיל. סביר להניח שבמקרה כזה נקבל תוצאות שגויות שלא צפינו להם. ב שפת סף, בניגוד לשפות עיליות (לדוגמה שפת פסקל, JAVA וכדומה), האחריות לחישוב כתובות תקינות מוטלת על המתכנת. קיימות שפות עיליות (לדוגמה שפת פסקל, JAVA וכדומה), שבהן חריגה כזו תגרור שגיאת הידור וכך תאפשר למתכנת להבחין בשגיאה מבעוד מועד ולתקן אותה.
36
מיעון אינדקס Direct Indexed Mode מערך חד-ממדי
גישה לאיברי מערך חד-ממדי שיטת מיעון זו מאפשרת גישה נוחה לכל האיברים של מערך חד-ממדי (או לחלק מהם). לדוגמה, נציג תכנית המסכמת איברי מערך a בו 5 איברים מטיפוס בית, ובהתאם האלגוריתם נממש הוא: השם sum=0 לכל i=0 עד i=4 בצע [sum=sum+a[I תכנון הפתרון- לחישוב כתובת של איבר במערך: ההעתק יצביע על הכתובת של האיבר הראשון במערך באוגר SI נצביע על איבר i במערך. מאחר ומערך הוא מטיפוס בית כדי להצביע על איבר i+1, עלינו להוסיף 1 לאוגר SI.
37
מיעון אינדקס Direct Indexed Mode מערך חד-ממדי
.MODEL SMALL .STACK .DATA a DB 1,2,3,4, 5 ; אתחול מערך בו 5 איברים בגודל בית sum db 0 סכום איברי המערך; .CODE start: ; אתחול מקטע הנתונים MOV AX, @DATA MOV DS, AX ; אתחול משתנים MOV SI, 0 ; מצביע על איבר המערך MOV AL, 0 ; מסכם איברי מערך again: ADD AL, a[SI] ; AL=AL +a[SI] INC SI ;SI=SI+1 קדם מציין לאיבר במערך CMP SI, 5 ; השווה מציין מערך למספר איברי המערך JNE again ; מציין שונה מאיבר אחרון במערך MOV sum, bl ; sum העתק סכום איברים למשתנה ; יציאה מתכנית MOV AX, 4c00h INT h END start
38
שימוש בקבועים MODEL SMALL .STACK 100h MAX EQU 5 .DATA a DB 1,2,3,4, 5 ; אתחול מערך בו 5 איברים בגודל בית sum db 0 סכום איברי המערך; .CODE שימוש בקבוע משפר גם את קריאות התכנית כך שלנתון מסוים ניתן לתת שם לוגי המתאר את משמעותו בתכנית. לאחר שהצהרנו על קבוע MAX, נוכל לשנות את התכנית ולרשום: CMP SI, MAX במקום CMP SI, 5
39
מיעון בסיסBase Relative Addressing
שיטת מיעון זו דומה לשיטת מיעון אינדקס אלא שבה משתמשים להצבעה באחד מאוגרי הבסיס BX ו- BP. אוגר BX מתאר היסט של כתובת יחסית לאוגר מקטע הנתונים (DS) ואוגר BP מתאר היסט של כתובת יחסית לאוגר מקטע מחסנית (SS). מנקודת מבט של מתכנת, אין הבדל מהותי בין מיעון אינדקס לבין מיעון בסיס ובמקרים מסוימים מתייחסים לשתי השיטות הללו בשם מיעון אינדקס. הכתובת במיעון בסיס מחושבת כסכום של : ההעתק + אוגר הבסיס
40
מיעון בסיסBase Relative Addressing
נציג מספר הוראות לדוגמה בשיטת מיעון זו: MOV AX, [BX-3] ;AX לאוגר BX -3 העתק איבר שכתובתו האפקטיבית היא ADD AX, a[BX] ;AX לאוגר BX הוא aחבר את האיבר שהיסט שלו מתחילת מערך
41
הצהרה על מבנה רשומה ירשם לפני מקטע הנתונים במבנה הבא:
שיטה מיעון זו נוחה כדי לגשת לשדה ברשומה (מבנה). רשומה ( record או (struct היא קבוצה של פריטים, הנקראים שדות, שלכל שדה יש שם מזהה והוא יכול להיות מטיפוס שונה. כדי להקצות מקום בזיכרון לרשומה, עלינו תחילה להגדיר מבנה של רשומה ולאחר מכן לאתחל את ערכי השדות בערכים. הצהרה על מבנה רשומה ירשם לפני מקטע הנתונים במבנה הבא: <שם רשומה> struc פירוט השדות <שם רשומה> ends
42
לדוגמה, נגדיר מבנה של רשומה בשם item המכילה את השדות הבאים:
מספר פריט מטיפוס מילה כמות במלאי מטיפוס בית מספר ספק המספק את הפריט מטיפוס מילה item struc itemnum DW ? quantity DB ? supplier DW ? item ends כעת נאתחל במקטע הנתונים שתי רשומות של פריט: .DATA
43
גישה לשדות רשומה במיעון בסיס
ברשומה, בניגוד למערך, לכל שדה יתכן גודל שונה ולכן בשימוש בשיטה זו: אוגר הבסיס יצביע כל כתובת של השדה הראשון ברשומה וההעתק יציין את ההיסט של שדה מסוים מתחילת הרשומה. לדוגמה, כדי להעתיק את הכמות של הפריט ברשומה הראשונה לאוגר AL נרשום את ההוראות הבאות: LEA BX, p1 MOV AL, [BX+2] אפשר גם לרשום MOV AL, BX[2]
44
.MODEL SMALL .STACK ; הגדרה על מבנה רשומת פריט item struc itemnum DW ? quantity DB ? supplier DW ? item ends .DATA ;אתחול ערכי שתי רשומות פריט p1 item <1111,100, 923> p2 item <2222,50,120> .CODE start: ; אתחול מקטע הנתונים MOV AX, @DATA MOV DS, AX LEA BX, p1 ; מצביע על תחילת הרשומה הראשונהBX MOV AL, BX[2] ;AL השדה כמות של הרשומה הראשונה = LEA BX, p2 ; מצביע על תחילת הרשומה השניהBX ADD AL, BX[2] ; AL = AL + השדה כמות של הרשומה השניה ; יציאה מתכנית MOV AX, 4c00h INT h END start
45
מיעון אינדקס-בסיס Based Indexed Addressing Modes
שיטת מיעון זו משלבת את שתי שיטות מיעון הקודמות: שיטת מיעון האינדקס עם שיטת מיעון הבסיס, ובהתאם כתובת הנתון אליו פונים בגישה זו מחושב כסכום של ] העתק] + אוגר הבסיס + אוגר אינדקס כאשר ההעתק הוא אופציונלי. ברישום כתובת בשיטה זו קיימים צירופי אוגרים מותרים וניתן לרשום את הכתובת בשתי צורות: [BX][SI] או [BX+SI] [BX][DI] או [BX+SI] [BP][SI] או [BP+SI] [BP][DI] או [BP+DI] האוגרים: BX, SI, DI מציינים היסט ביחס לכתובת בסיס במקטע DS אוגר BP מציין היסט ביחס לכתובת בסיס במקטע SS
46
מיעון אינדקס-בסיס Based Indexed Addressing Modes
לדוגמה, נניח כי: BX = 1000h ואוגר SI = 880h, ההוראה mov al, [BX][SI] מעתיקה את הנתון בכתובת DS:[1880] אל אוגר AL, כמתואר באיור
47
מיעון אינדקס-בסיס Based Indexed Addressing Modes
דוגמה, אם נניח כי: BX = 1000h ואוגר SI = 880h, וההעתק הוא 4, ההוראה MOV AL, [BX+SI+4] מעתיקה את הנתון בכתובת DS:[1884] אל אוגר AL, כמתואר באיור. באופן דומה ניתן לרשום כתובת במיעון אינדקס-בסיס עם העתק [BX+SI+disp] אוdisp[BX][si] [BX+DI+disp] אוdisp[BX][DI] [BP+SI+disp] אוdisp[BP][SI] [BP+DI+disp] אוdisp[BP][DI]
48
מיעון אינדקס-בסיס Based Indexed Addressing Modes
שיטת מיעון זו מאפשרת גמישות רבה יותר מאשר שתי המיעון הקודמות משום שבה: ניתן לשנות את ערך אוגר הבסיס או ערך אוגר האינדקס או את שניהם גם יחד. שימוש בשני מציינים שניתנים לשינוי מתאים לעיבוד מערך דו-ממדי רשומה שמכילה שדות שהם מערכים וכדומה.
49
הגדרת מערך דו-ממדי מערך דו-ממדי מאוחסן בזיכרון לינארי ולכן יש צורך
למפות כל איבר במערך למיקום בזיכרון להקצות שטח זיכרון רציף שיספיק לכל איברי המערך חישוב גודל הזיכרון הדרוש למערך: גודל הזיכרון (מספר הבתים) הדרוש למערך בו n שורות ו- m עמודות כאשר כל איבר הוא מטיפוס p, מחושב כ: n*m*p בתים . לדוגמה, במערך דו-ממדי בן 5 שורות ו- 4 עמודות מטיפוס בית יוקצו: 4*5=20 בתים, ולאותו גודל של מערך מטיפוס מילה יוקצו בסך הכל 5*4*2=40 בתים בזיכרון.
50
הגדרת מערך דו-ממדי כדי להצהיר על מערך דו-ממדי מטיפוס בית בו 4 שורות ו- 5 עמודות ניתן לרשום את ההצהרה a DB 4*5 DUP(?) הצהרה זו שקולה להצהרה הבאה: a DB 4 dup (5 DUP (?) ) כדי לאתחל את ערכי המערך באיברים ניתן לרשום את ההצהרה הבאה: a DB 2, 7, 3, 4, 32 DB 5, 9, 0, 1, 15 DB 34, 6, 28, 19, 23 DB 22, 35, 78, 12, 32 דרך אחרת היא לרשום את כל הערכים באותה שורה: a DB 2,7,3,4,32,5,9,0,1,15 ,34,6,28,19,23,22,35,78,12,32 בשני המקרים יוקצו 20 תאים רצופים ובכל אחד מהם יואחסן ערך אחד, שימו לב מבחינת המעבד אין הבדל בין הקצאה של תאים למערך חד-ממדי לעומת מערך דו-ממדי.
51
הגדרת מערך דו-ממדי שתי שיטות למיפוי איברי המערך דו-ממדי כמערך חד-ממדי:
מיפוי לפי שורות, כאשר 4 תאים ראשונים הם איברי השורה הראשונה במערך, 4 התאים הבאים הם איברי השורה השנייה וכך הלאה מיפוי לפי עמודות, כאשר 4 תאים ראשונים הם איברי העמודה הראשונה במערך, 4 התאים הבאים הם איברי העמודה השנייה וכך הלאה אנו נשתמש במיפוי שורה, שהיא שיטת המיפוי הקובלת בשפות עיליות כמו פסקל, C
52
הגדרת מערך דו-ממדי
53
גישה לאיבר מערך דו-ממדי
כדי לפנות לאיבר מסוים במערך הדו-ממדי, עלינו לחשב את ההיסט של האיבר מתחילת המערך בהתאם למיפוי שורה. באופן כללי, מיקומו של איבר [i,j] יחושב בצורה הבאה: displacement = ((i-1) * COLUMNS +( j-1)) * ELEMENT_SIZE כאשר COLUMNS = מספר עמודות במערך ELEMENT_SIZE = גודל איבר שימו לב כי מצייני שורה ראשונה ועמודה ראשונה הם 0 ולא 1 .
54
מערך דו-ממדי נכתוב תכנית המגדירה מערך דו-ממדי בו 5 שורות ו- 10 עמודות ומאתחלת את איברי המערך לסדרת המספרים הזוגיים החל מ- 0, 2, 4, 6, .... וכך הלאה.
55
מערך דו-ממדי ROW EQU 5 COLUMN EQU 10 .data a DB ROW*COLUMN dup(?)
.model small .stack 100h ROW EQU 5 COLUMN EQU 10 .data a DB ROW*COLUMN dup(?) .code start: mov ax, @DATA mov ds, ax ; השמת ערכים במערך MOV AL, 0 MOV SI, 0 again: ; for BX=0 to ROW*COLUMN MOV a[SI], AL ADD aL, 2 INC SI CMP SI, ROW*COLUMN JB again ;;יציאה mov ax, 4ch int h end start מערך דו-ממדי
56
תכנית שניה: מאתחלת מערך דו ממדי בו 3 שורות ו- 4 עמודות בסדרת המספרים: 1,2,3,.... התכנית תחשב סכום כל שורה ותשמור את הסכום במערך חד-ממדי sum בו 3 איברים (בכל איבר סכום של שורה אחת במערך הדו-ממדי).
57
תכנון פתרון: נגדיר קבועים ROW המציין מספר שורות ו- COLUMN המציין מספר עמודות. כמו כן נגדיר שני מערכים: a מערך בו יאוחסנו איברי המערך הדו-ממדי ו- sum בו יאוחסנו סכומי השורות. בהצבעה לאיבר במערך הדו-ממדי a נשתמש במיעון אינדקס-בסיס עם העתק ובהתאם נשתמש באוגרים: BX ו- SI. בהצבעה לאיבר במערך החד-ממדי נשתמש במיעון אינדקס ובהתאם נשתמש באוגר DI.
58
.model small .stack 100h ROW EQU 3 COLUMN EQU 5 .data a DB 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 ; אתחול מערך sum DB ROW dup(0) .code start: mov ax, @DATA mov ds, ax ;אתחול אוגרים XOR BX, BX XOR DI, DI
59
;סיכום שורות ; for BX=0 to COLUMN*ROW loop_row: ; אתחול אוגרים XOR SI, SI XOR CX, CX ; לולאה פנימית לסיכום שורה אחת ;for SI=0 to COLUMN-1 loop_column: ADD CL, a[BX][SI] INC SI CMP SI, COLUMN JB loop_column ; סוף לולאה פנימית MOV sum[DI], CL ;sum אחסון תוצאה במערך INC DI ADD BX, COLUMN CMP BX, ROW*COLUMN JB loop_row ; סוף לולאה חיצונית ; יציאה mov ax, 4ch int h end start
60
לסיכום הטבלה הבאה מתארת שיטה קלה לזכור את הצירופים האפשריים של שיטות מיעון הזיכרון במעבד 8086 כאשר שיטת מיעון יכולה להיות מורכבת מצרוף של בחירה אחת או אפס איברים מכל עמודה. אוגר מקטע המצוין בסוגריים מתאר את המקטע אליו מתייחסת הכתובת המחושבת. כאשר יש צירוף של אוגר בסיס מעמודה שניה עם אוגר בסיס מעמודה שלישית, מתייחסים למקטע אליו מתייחס אוגר הבסיס.
61
גישה לאיבר מערך דו-ממדי
לדוגמה, לחישוב ההיסט של איבר a[3,4] במערך בו 4 שורות ו- 5 עמודות ואיבריו הם מטיפוס בית נציב את הערכים: i=3 j=4 מספר העמודות COLUMNS = 5 גודל איבר ELEMENT_SIZE=1 חישוב היסט של האיבר מתחילת המערך: 3-1)*5+(4-1))*1= 2*5+3=13)) אם המערך הוא מטיפוס מילה יש להכפיל את החישוב הקודם ב- 2 : 3-1)*5+(4-1))*2= (2*5+3)*2= 26))
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.