תרגול 12 מלכודות בניית ה- Debugger 1 מבוסס על שקפים מאת יאן ציטרין מלכודות במצבים מסוימים המעבד מפסיק את ריצת התוכנית הנוכחית ועובר לביצוע של שגרה מיוחדת שכתובתה נמצאת במקום שמור בזיכרון. דוגמאות: כתובת אי זוגית ב- PC (4,6) פקודה לא חוקית (12,10) אירוע כזה נקרא מלכודת (פסיקת תוכנה). בניגוד לפסיקות רגילות שהן תוצאות של אירוע חיצוני, מקור של מלכודת תוכנית עצמה. 2 1
תזכורת: מנגנון קפיצה וחזרה מפסיקה פסיקה וקטור הפסיקה α α + 2 pc psw RTI PC PSW pc psw 3 מנגנון המלכודת בדיוק כמו וקטור הפסיקות וקטור מלכודת α α + 2 קפיצה למלכודת pc psw PC PSW pc psw RTT יש הבדל קטן בין ל- RTI RTT הוא יובהר בהמשך 4 2
השוואה בין המלכודות לפסיקות פסיקות אירוע נגרם ע"י התקן חיצוני המתכנת אינו יודע מתי תתרחש הפסיקה ביצוע פסיקה מותנה בעדיפות חומרה גדולה מעדיפות תוכנה המנגנון משתמש במלות Status ו- Buffer כתובת שיגרת שירות נמצאת בוקטור פסיקות מנגנון הקפיצה והחזרה: שמירה ושחזור של PC ו- PSW חזרה: RTI 5 המלכודות "פסיקות תוכנה". פקודה או אירוע בתוך תוכנה במקרים מסוימים המתכנת בעצמו מכניס את פקודת המלכודת לתוכנה, ואז הוא יודע בדיוק מתי המלכודת תתרחש המלכודת מתבצעת תמיד. אין מושג עדיפות חומרה לא משתמשים במלות Status ו- Buffer כתובת שיגרת שירות נמצאת בוקטור מלכודות מנגנון הקפיצה והחזרה זהה לזה של הפסיקות חזרה: RTT 15 14 13 12 11 T-bit 10 9 8 7 6 5 4 3 2 1 0 T N Z V C דרך נוספת לגרום לפסיקת תוכנה היא להדליק את ה- T-bit במילת הסטטוס של המעבד (PSW) אחרי ביצוע של כל פקודה ה- CPU בודק את ה- T-bit אם הוא דלוק מתבצעת קפיצה למלכודת בכתובת (16,14) המנגנון הזה מאפשר לממש - tracing ביצוע של איזושהי תוכנית, פקודה אחרי פקודה, כאשר בסיום ביצוע של כל פקודה השליטה חוזרת למשתמש 6 3
ההבדל בין RTI ל- RTT אחרי פק ודת RTT לא מתבצעת בדיקת ה- T-bit ניתן להשתמש בתכונה המיוחדת הזו לצורך בניית debugger פשוט (נקרא לו ( tracer 7 הרעיון של ה- tracer אתחול: כתובת התחלת התוכנית המדובגת ו- PSW עם ה- T-bitדלוק נמצאים בראש ה- tracer נמצא בשגרת שירות של מלכודת (16,14) אופן הפ עול ה:.1.2.3 ה- tracer מבצע.RTT אחרי ביצוע RTT המעבד אינו מתייחס ל-.T-bit המעבד מבצע פקודה ראשונה של התוכנית המדובגת ובעקבות ה- T-bit מתבצעת קפיצה למלכודת (16,14), כלומר ל- tracer. חזרה לשלב 1. 8 4
הסכמה של ה- tracer tracer push PSW (T-bit on) וקטור המלכודת push #main PC=#main 14 HandleT rtt PSW(T-bit on) 16 PSW main: mov add HandleT: print r0 rtt זוהי הפקודה הראשונה של התוכנית המדובגת בעקבות הביצוע של rtt תתחיל להתבצע התוכנית המדובגת לאחר ביצוע של כל פקודה ב- main נכנסים למלכודת (14,16) 9 מלכודת BPT והרחבת ה- tracer הבעיה של ה- tracer שראינו : לא מאפשר הרבה דברים שהיינו רוצים מה- debugger, למשל בדיקת ערכי הרגיסטרים או זיכרון בצורה אינטראקטיבית (ולא כמו קודם בכל breakpoint לבצע סדרה קבועה של פעולות) BPT מלכודת, אשר הוקטור שלה נמצא ב-( 16,14), כלומר אותה שגרת שירות כמו ל- T-bit ניתן להשתמש ב- BPT על מנת להכניס breakpoints לתוכנית המדובגת וברגע שהתוכנית עוצרת ב- breakpoint שהגדרנו לאפשר למשתמש לבצע :monitoring לראות ערכים של הרגיסטרים להמשיך ריצה של התוכנית המדובגת ועוד 10 5
טיפול ב- breakpoints א) ב) השתלת ה- breakpoint בוחרים פקודה בתוכנית שלפניה רוצים לעצור, שומרים אותה במקום אחר בזיכרון, ובמקומה מכניסים את ה- opcode של BPT (ערך 000003) עצירה ב- breakpoint מבצעים את התוכנית וברגע שנגיע לפקודת BPT (שהוחלפה לפני כן) נקפוץ לשגרת השירות של המלכודת (ממשק של ה- (.Debugger 11 תרשים הזרימה של ה- debugger ב- interface מחליפים את הפקודה המקורית ל- BPT (000003) מבצעים BPT ב- main ובעקבות כך נכנסים למלכודת משחזרים את הפקודה המקורית מעבירים שליטה למשתמש (שיוכל לבצע (monitoring מדליקים את ה- T-bit בתוך PSW שבמחסנית חוזרים לתוכנית הראשית מבצעים פקודה מקורית וחוזרים ל- debugger בגלל ה- T-bit מחליפים את הפקודה המקורית ב- BPT מכבים את T-bit (כדי לעצור רק לפני הפקודה ב- breakpoint ) 12 6
debugger debugger: mov pc, sp tst (sp) mov #break_subr, @#14 ; Initialize trace clr @#16 ; and BPT vector jsr pc, interface jsr pc, main בדוגמה הזו התוכנית מתחילה להתבצע לא מ- main אלא מה- debugger jsr halt pc, interface main: mov #7, r0 loop : sob r0, loop rts pc baddr:.word loop ; the address of the original ; command save:.blkw 1 ; the original command is ; saved here נותנים למשתמש להגדיר פעולה של debugger (ההנחה הסמויה שהוא יכניס לפני ה- loop breakpoint זוהי התוכנית "המדובגת.שימו לב שהיא מסתיימת ב- RTS ולא ב- HALT 13 User Interface interface: waitp: tstb @#tps bpl waitp movb # $, @#tpb print the promt waitr: tstb @#tks bpl waitr movb @#tkb, userinp checkr: cmpb userinp, # r bne checkb movb r0, temp bic #177770, temp add #60, temp busy_w: tstb @#tks bpl busy_w movb temp, @#tpb br ret read the input into userinp prints the value of the r0 on the display 14 7
User Interface (cont.) checkb: cmpb userinp, # b ; inserts breakpoint to baddr bne checkc mov @baddr, save ; saves the original command mov #000003, @baddr ; puts BPT instead of the br ret ; original command checkc: cmpb userinp, # c ; continue bne interface ret: rts pc userinp:.blkw 1 temp:.blkw 1 15 שיגרת השירות של BPT BPT BPT T-bit מחזיר י ם פק ודה מקור ית מקטינ י ם כת ובת חזרה מדליקים T-bit בתוך PSW במחסנית ממשק המש תמש מבצע ים RTT.1.2.3.4.5 מחזיר י ם את ה- BPT מכבי ם את ה-- T PSW bitבתוך במחסנית מבצע ים RTT.1.2.3 16 8
שגרת שרות של המלכודת break_subr: bit #20, 2(sp) ; Is the T-bit set? bne T_called BPT_called: mov save, @baddr ; restore the original command sub #2, 0(sp) ; make the PC re-run the ; command on the breakpoint bis #20, 2(sp) ; T-bit on jsr pc, interface rtt T_called: mov #000003, @baddr ; replace the original ; command with BPT bic #20, 2(sp) ; Clear the T-bit rtt 17 9