Presentation is loading. Please wait.

Presentation is loading. Please wait.

תכן לוגי ומבוא למחשבים תרגול 131 קריאה לשיגרה (דוגמה) # simple example ‘swap two numbers’.text.globlmain main: la$a0, array addi$a1, $0, 0 jswap back:.data.

Similar presentations


Presentation on theme: "תכן לוגי ומבוא למחשבים תרגול 131 קריאה לשיגרה (דוגמה) # simple example ‘swap two numbers’.text.globlmain main: la$a0, array addi$a1, $0, 0 jswap back:.data."— Presentation transcript:

1 תכן לוגי ומבוא למחשבים תרגול 131 קריאה לשיגרה (דוגמה) # simple example ‘swap two numbers’.text.globlmain main: la$a0, array addi$a1, $0, 0 jswap back:.data array:.word 5, 4, 3, 2, 1 #swap(int v[], int k) #{ #int temp; #temp = v[k]; #v[k] = v[k+1]; #v[k+1] = temp; #} swap:add$t1, $a1, $a1 add$t1, $t1, $t1 add$t1, $a0, $t1 lw$t0, 0($t1) lw$t2, 4($t1) sw$t2, 0($t1) sw$t0, 4($t1) jback - למה לא לחזור מהשיגרה עם הפקודה j Back כאשר Back היא תווית המשוייכת לשורה שאחרי j ? - מה הבעיה בשיטת הקריאה הנ"ל ?

2 תכן לוגי ומבוא למחשבים תרגול 132 קריאה לשיגרה (דוגמה) # simple example ‘swap two numbers’.text.globlmain main: la$a0, array addi$a1, $0, 0 jalswap.data array:.word 5, 4, 3, 2, 1 #swap(int v[], int k) #{ #int temp; #temp = v[k]; #v[k] = v[k+1]; #v[k+1] = temp; #} swap:add$t1, $a1, $a1 add$t1, $t1, $t1 add$t1, $a0, $t1 lw$t0, 0($t1) lw$t2, 4($t1) sw$t2, 0($t1) sw$t0, 4($t1) jr$ra - נעדיף לבצע את הקריאה ע"י jal, ואת החזרה מהשגרה ע"י jr $ra. מדוע?

3 תכן לוגי ומבוא למחשבים תרגול 133 מוסכמות קריאה לשיגרה (1) ישנן מוסכמות בין השיגרה הקוראת (Caller) לבין השיגרה הנקראת (Callee) לגבי: - העברת ארגומנטים לשיגרה. - החזרת תוצאות. - באילו רגיסטרים מותר לשיגרה הנקראת להשתמש בלי לשמור על תוכנם ובאילו אסור. אפנדיקס של הספר A22-A32

4 תכן לוגי ומבוא למחשבים תרגול 134 מוסכמות קריאה לשיגרה (2) - העברת ארבעת הארגומנטים הראשונים לשיגרה ברגיסטרים $a0-$a3 - החזרת תוצאות ברגיסטרים $v0-$v1 - השיגרה הנקראת יכולה להשתמש ברגיסטרים $t0-$t9 בלי לשמור על תוכנם - לאחר קריאה לשיגרה, תוכנם של הרגיסטרים $s0-$s7 חייב להישאר כפי שהיה לפניה שאלות פתוחות: - איך מעבירים יותר מארבעה ארגומנטים? - מה עושים אם השיגרה הקוראת צריכה את תוכנם של חלק או כל הרגיסטרים $t0-$t9 לאחר הקריאה? - מה עושים אם השיגרה הנקראת רוצה להשתמש בחלק או כל הרגיסטרים $s0-$s7?

5 תכן לוגי ומבוא למחשבים תרגול 135 NameReg #UsePreserved on call $zero0Constant 0No $v0-$v12-3Results and expressionsNo $a0-$a34-7ArgumentsYes $t0-$t78-15TempNo $s0-$s716-23“saved”Yes $t8-$t924-25TempNo $gp28Global PointerYes $sp29Stack PointerYes $fp30Frame PointerYes $ra31Return AddressYes מוסכמות קריאה לשיגרה (3)

6 תכן לוגי ומבוא למחשבים תרגול 136 מוסכמות קריאה לשיגרה (4) מחסנית (Stack) תחום הכתובות אליהן ניגשים ביחס ל- $fp עבור כל שיגרה מוקצה איזור זיכרון במחסנית הנקרא frame לטובת: - העברת ארגומנטים מעבר לארבעה - שמירת תוכן הרגיסטרים אשר השיגרה הקוראת לא מעוניינת בשינוי שלהם - עבור משתנים פנימיים של השיגרה

7 תכן לוגי ומבוא למחשבים תרגול 137 מוסכמות קריאה לשיגרה (5) Caller pre-call שלב ראשון – העברת ארגומנטים: - ארבעת הראשונים מועברים בתוך $a0-$a3 - שאר הארגומנטים מועברים במחסנית (בסדר כזה שהארגומנט החמישי בראש המחסנית) שלב שני – שמירת רגיסטרים אשר באחריות השיגרה הקוראת: - שמירת אותם ערכי רגיסטרים מתוך $t0-$t9 אשר רוצים להשתמש בהם לאחר הקריאה שלב שלישי – קריאה לשיגרה - ביצוע פקודת jal

8 תכן לוגי ומבוא למחשבים תרגול 138 מוסכמות קריאה לשיגרה (6) Callee prologue שלב ראשון – הקצאת מסגרת זיכרון חדשה: - החסרת גודל המסגרת הרצויה מ- $sp addiu $sp, $sp, - - בצורה אופיינית, גודל המסגרת המינימלית הוא 32 בתים (8 מילים) שלב שני – שמירת רגיסטרים אשר באחריות השיגרה הנקראת: - רגיסטר $fp נשמר תמיד - רגיסטר $ra נשמר אם שיגרה זו מבצעת קריאה לשיגרה אחרת - רגיסטרים $a0-$a3 נשמרים אם הולכים לשנות אותם - רגיסטרים $s0-$s7 נשמרים אם הולכים להשתמש בהם שלב שלישי – עידכון המצביע $fp addiu $fp, $sp,

9 תכן לוגי ומבוא למחשבים תרגול 139 מוסכמות קריאה לשיגרה (7) Callee epilogue שלב ראשון – החזרת תוצאה: - השמת תוצאה ל- $v0 ו- $v1 במידת הצורך שלב שני – שיחזור ערכי הרגיסטרים אשר באחריות השיגרה הנקראת: - $s0-$s7, $ra, $fp שלב שלישי – שיחרור זיכרון המוקצה למסגרת: addiu $sp, $sp, שלב רביעי – חזרה לשיגרה הקוראת jr $ra

10 תכן לוגי ומבוא למחשבים תרגול 1310 מוסכמות קריאה לשיגרה (8) Caller post-call שלב ראשון – שיחזור ערכי הרגיסטרים אשר באחריות השיגרה הקוראת: - טעינת אותם הרגיסטרים מתוך $t0-$t9 אשר נשמרו במחסנית לפני הקריאה

11 תכן לוגי ומבוא למחשבים תרגול 1311 דוגמה (חישוב עצרת בצורה רקורסיבית) main() { return (fact(10)); } int fact (int n) { if (n < 1) return (1); return (n * fact(n-1)); }

12 תכן לוגי ומבוא למחשבים תרגול 1312 דוגמה (חישוב עצרת בצורה רקורסיבית).text.globl main main: [0x00400000] addiu$sp, $sp, -32# stack frane size is 32 bytes [0x00400004] sw$ra, 20($sp)# save return address [0x00400008] sw$fp, 16($sp)# save frame pointer [0x0040000C] addiu$fp, $sp, 28# set frame pointer [0x00400010] li$a0, 10# initialize the first argument [0x00400014] jalfact# call factorial function [0x00400018] lw$ra, 20($sp)# restore return address [0x0040001C]lw$fp, 16($sp)# restore frame pointer [0x00400020] addiu$sp, $sp, 32# pop the stack [0x00400024] jr$ra# return to caller

13 תכן לוגי ומבוא למחשבים תרגול 1313.text fact: [0x00400028] addiu$sp, $sp, -32# stack frane size is 32 bytes [0x0040002C] sw$ra, 20($sp)# save return address [0x00400030] sw$fp, 16($sp)# save frame pointer [0x00400034] addiu$fp, $sp, 28# set frame pointer [0x00400038] sw$a0, 0($fp)# save argument (n) [0x0040003C] bgtz$a0, callagain# if (n >0) goto callagain [0x00400040] li$v0, 1# return 1 [0x00400044] jcomplete callagain: [0x00400048] subiu$a0, $a0, 1# $a0 = n - 1 [0x0040004C] jalfact# call factorial function again [0x00400050] lw$a0, 0($fp)# load n [0x00400054] mul$v0, $a0, $v0# $v0 = n*fact(n-1) complete: [0x00400058] lw$ra, 20($sp)# restore return address [0x0040005C] lw$fp, 16($sp)# restore frame pointer [0x00400060] addiu$sp, $sp, 32# pop the stack [0x00400064] jr$ra# return to caller

14 תכן לוגי ומבוא למחשבים תרגול 1314 תמונת המחסנית במהלך הריצה כיוון גדילת המחסנית


Download ppt "תכן לוגי ומבוא למחשבים תרגול 131 קריאה לשיגרה (דוגמה) # simple example ‘swap two numbers’.text.globlmain main: la$a0, array addi$a1, $0, 0 jswap back:.data."

Similar presentations


Ads by Google