תרגול 6 הסתעפויות 1 מבוסס על שקפים מאת יאן ציטרין
קפיצות לא מותנות Unconditional Branch br label PC לאחר ה- fetch של פקודת ה- branch PC לאחר הביצוע של פקודת ה- branch pc label br label הקפיצה מתבצעת תמיד, בלי שום תנאי )מכאן השם( 2
לא מותנה - Branch קידוד 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 0 0 0 0 0 0 1 x x x x x x x x opcode offset -128 10 offset 127 10 octal base code of br: 000400 ניתן לקפוץ קדימה או אחורה ל offset מילים כיצד נקפוץ מעבר למרחק הזה? 3
Base Code base code בבית הנמוך תמיד מכיל אפסים 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 - Offset בבית הגבוה + תמיד מכיל אפסים 0 0 0 0 0 0 0 0 x x x x x x x x coding : base code + offset 0 0 0 0 0 0 0 1 x x x x x x x x 4
קשר בין offset לכתובת היעד target address = PC after br fetching + 2 * offset offset = target address 2 - PC after br fetching 5
לא מותנה Branch )דוגמה( 1014 8 begin: offset 1014 1054 208 2... 11 110 000 pc 1052 8 1054 8 br begin 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 ובאוקטלי 0 0 0 7 6 0 6 ה- basecode וה- offset מתערבבים ביצוג אוקטאלי
קפיצות מותנות Conditional Branch בתוכנות אמיתיות נרצה לבצע קטעי קוד ספציפיים רק כאשר תנאים מסוימים מתקיימים לשם כך ניתן להשתמש בקפיצות מותנות הקפיצות הללו תלויות בערכים של הדגלים ב- PSW 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 N Z V C הדגלים האלה מקבלים ערכים "0" או "1" כתוצאה מביצוע פקודות של PDP-11 )תזכרו ) asl, asr Negative Zero overflow Carry out 7
Branch -ים מותנים )המשך( קפיצות מותנות מתבצעות בד"כ מייד אחרי פקודה cmp op 1, op 2 מבצעים ( op 1 _ - op 2 בניגוד לפקודה ) sub התוצאה של החיסור לא נשמרת בשום מקום, אלא לפי ערכה נקבעים הערכים של הדגלים ה- branch שמופיע מייד אחרי ה- cmp הזה "מסתכל" על הדגל Z וכתוצאה מכך מתבצעת קפיצה Z = 1 Branch if EQual cmp #5, #5 beq A 8
Branch -ים מותנים - קידוד לכל פקודות branch מותנות אותו אופן קידוד כמו ל- br בלתי מותנה ההבדל היחיד הוא ב- base code לכן חישוב כתובת היעד מתבצע לפי אותה נוסחה שראינו בתחילת השיעור. 9
איזה מהמספרים הבאים גדול יותר? 1101? 0011 10
משפחות שונות של Branch -ים מותנים כבר ראינו שיטות שונות לייצג מספרים: Unsigned )רק עבור מספרים חיוביים( 2 s Complement ראינו שחשוב מאוד לדעת באיזו שיטה אנחנו עובדים. הבחירה בסוג הייצוג תלויה בנתונים והיא באחריות המתכנת )כלומר, באחריותכם!( 11
Signed Conditional Branches Base Code דגלים פקודה תנאי לקפיצה תנאי לקפיצה אחרי פקודה cmp op 1, op 2 002000 bge Greater than or equal to (zero) op 1 op 2 N xor V = 0 002400 blt Less than (zero) op 1 op 2 N xor V = 1 003000 bgt Greater than (zero) 003400 ble Less than or equal to (zero) op 1 > op 2 Z (N xor V) = 0 op 1 op 2 Z (N xor V) = 1 לדגלים N ו- V יש משמעות רק כשעובדים עם מספרים בעלי סימן. לכן הפקודות הללו בודקות אותם. 12
Unsigned Conditional Branches Base Code דגלים פקודה תנאי לקפיצה תנאי לקפיצה אחרי פקודה cmp op 1, op 2 101000 bhi Higher op 1 > op 2 C Z = 0 101400 blos Lower or same op 1 op 2 C Z = 1 103000 bhis Higher or same op 1 op 2 C = 0 103400 blo Lower op 1 op 2 C = 1 שימו לב: הפקודות הללו בודקות רק את הדגלים C ו- Z. 13
Branch -ים מותנים המתייחסים לדגל בודד Base Code פקודה תנאי לקפיצה תנאי לקפיצה אחרי פקודה cmp op 1, op 2 001000 bne Not equal to 0 op 1 op 2 Z = 0 001400 beq Equal to 0 op 1 = op 2 Z = 1 100000 bpl Plus N = 0 דגלים 100400 bmi Minus N = 1 14
Branch -ים מותנים המתייחסים לדגל בודד )המשך( Base Code פקודה תנאי לקפיצה דגלים 102000 Overflow is clear bvc V = 0 102400 Overflow is set bvs V = 1 103000 Carry clear bcc C = 0 103400 Carry set bcs C = 1 15
השפעת הדגלים לביצוע קפיצות דוגמה עבור bge op 1 op 2 op 1 < op 2 op 1 < op 2 op 1 > op 2 תאור המצב V N האם קופצים התוצאה נכונה התוצאה חיובית 0 = V 0 = N = 0 התוצאה נכונה V 1 = N התוצאה שלילת = 1 התוצאה שגויה התוצאה חיובית V 0 = N = 1 התוצאה שגויה V 1 = N התוצאה שלילת 0 0 Yes 0 1 No 1 0 No 1 1 Yes Not because N=1 16
C & V under Subtraction כבר ראינו את משמעות של הדגלים C ו- V עבור פעולת החיבור. כעת נלמד מה משמעותם כשמבצעים פעולת החיסור. V = C = אם האופרנדים הם בעלי סימן הפוך וסימן התוצאה הוא כמו של האופרנד השני 1, אחרת,0 אם כדי לבצע פעולה חייבים לבצע השאלה ל- MSB )borrow( 1, אחרת,0 17
C & V under Subtraction borrow C = 1 C דוגמה 1 סימן התוצאה הוא כמו סימן האופרנד השני V = 1 0 1 1 1-1 0 0 1 1 1 התוצאה שלילית N = 1 1 0 התוצאה אינה 0 Z = 0 cmp #7, #-7 N Z V C 1 0 1 1 bhis bpl bge פקודה תנאי לבדיקה C = 0 N = 0 N = V האם מתבצעת קפיצה No No Yes 18
borrow C = 1 C & V under Subtraction C דוגמה 2 cmp #3, #-3 0 0 1 1-1 1 0 1 N Z V C 0 1 1 0 0 0 0 1 19 סימן התוצאה אינו כמו סימן האופרנד השני V = 0 התוצאה חיובית N = 0 התוצאה אינה 0 Z = 0 bhis bpl bge פקודה C = 0 N = 0 N = V תנאי לבדיקה No Yes Yes האם מתבצעת קפיצה
C & V under Subtraction 3 אין borrow 0 1 0 1-0 0 1 1 0 0 1 0 דוגמה C = 0 cmp #5, #3 סימני האופרנדים זהים V = 0 התוצאה חיובית N = 0 התוצאה אינה 0 Z = 0 bhis bpl bge פקודה C = 0 N = 0 N = V תנאי לבדיקה N 0 Z 20 האם מתבצעת קפיצה 0 V 0 Yes Yes Yes C 0
SOB (Subtract One and Branch) sob r n, A dec r n bne A PDP-11 משתמשים בלולאות לא קיים בכל הדגמים של loop: mov #3, r2 loop body sob r2, loop דוגמא: ; the value of r2 ; should not be ; changed in ; the loop body הלולאה הזאת תתבצע 3 פעמים 21
15 14 13 12 11 10 קידוד 9 8 7-6 SOB 5 4 3 2 1 0 בינארי 0 1 1 1 1 1 1 r r r x x x x x x 0 7 7 R X X opcode register positive unsigned offset אוקטלי (PC) (PC) 2*X הערות חשובות )מאד(: שיטת המעון של R תמיד 0 1. הקפיצה תמיד אחורנית 2. 22
jmp op קפיצות לא מותנות ע"י פקודת jmp pc הפקודה קופצת לכתובת האפקטיבית של האופרנד לאן נקפוץ בפקודות הבאות? 23 label jmp label jmp (r0) jmp r0 jmp 3000 jmp #3000 3000 לכתובת למילה הבאה אחרי פקודת.jmp ערכה.3000 מאפשרת קפיצות למרחק גדול לכתובת הרשומה בR0 בדרך כלל זו טעות. פקודה לא חוקית. אין לאופרנד כתובת אפקטיבית
חידות דוגמאות ממבחן CLR R0 LOOP: DEC R0 BNE LOOP HALT? נתונה התוכנית הבאה: כמה פעמים מתבצעת הפקודה DEC פעמים פעמים 2 15 2 16 2 15-1 פעמים 2 16-1 פעמים אינסוף פעמים פעם אחת בלבד 24 2 16 פעמים 000000 000001 = 177777 177777 000001 = 177776 000001 000001 = 000000.1.2.3.4.5.6
חידות דוגמאות ממבחן MOV #3, R0 LOOP: ADD #2, R0 BHIS LOOP HALT 3, 5, 7, 11, 13,, 177777? נתונה התוכנית הבאה: כמה פעמים מתבצעת הפקודה BHIS 2 15-1 פעמים 15 פעמים 2 14-1 פעמים 14 פעמים 2 16-1 פעמים אף אחת מהנ"ל 25 רק בהוספה הבאה 1=C BHIS קופצת כאשר 0=C. הפקודה ADD תתבצע 2 15 2 פעמים ועוד פעם אחת כאשר BHIS לא גורמת לקפיצה. שימו לב לשאלה לא שואלים כמה פעמים BHIS תגרום לקפיצה.1.2.3.4.5.6
אופן פעולה של ROR C dst : ROR dst פעולה (Rotate Right) ROR מבצעת הזזה מעגלית של האופרנד ביט אחד ימינה כאשר דגל Carry הינו חלק מהמעגל של ה- PSW C של האופרנד מועבר לדגל LSB הערך הקודם של ה- Carry מועבר ל- MSB של האופרנד תוצאת פעולת ROR תלויה בדגל,Carry כלומר תלויה בפקודה שהתבצעה לפניה. הערה: באופן דומה עובדת הפקודה (Rotate Left) ROL 26
חידות דוגמאות ממבחן MOV #177777, R0 TSTB (R0)+ LOOP: DEC R0 ROR R0 BLO LOOP HALT? קופצת אם = 1 C אחרי TSTB בתוך (C=0) 000000 :R0 אחרי DEC ראשון בתוך )C 177777 R0: אינו מושפע( אחרי ROR ראשון בתוך (C=1) 077777 :R0 אחרי DEC שני בתוך )C 077776 R0: אינו מושפע( אחרי ROR שני בתוך (C=0) 137777 :R0 נתונה התוכנית הבאה: Branch Lower כמה פעמים מתבצעת הפקודה ROR פעם אחת 15 פעמים 2 15-1 פעמים אינסוף פעמים פעמיים גדל ב- 1 בזכות פעולה על בית C אינה משנה דגל DEC R0 אף אחת מהנ"ל 27.1.2.3.4.5.6