Παραδείγματα Assembly Μέρος Γ 1 Άσκηση 1 (α) Σε τι χρησιμεύει η Στοίβα στο Spim, όσο αφορά τη ροή ενός προγράμματος; α) Για προσωρινή αποθήκευση του καταχωρητη $ra σε περιπτώσεις που έχουμε κλήση συνάρτησης μέσα από μια συνάρτηση β) για προσωρινή αποθήκευση των καταχωρητών $s πριν από μια κλήση συνάρτησης που επαναχρησιμοποιεί κάποιον καταχωρητή από τους $s. 2
Άσκηση 1 (β) Τι είναι η Στοίβα και ποια η πολιτική που ακολουθείται κατά το γέμισμα και άδειασμα της; Εξηγήστε τι είναι ο $sp και ο $bp και ποια η σχέση τους πριν αποθηκευτεί κάποιο στοιχείο στη Στοίβα. Η στοίβα είναι μια δομή δεδομένων στη μνήμη που ακολουθεί την πολιτική Last-In-First-Out. O $bp είναι δείκτης στη βάση της Στοίβας και ο $sp είναι ο δείκτης της Στοίβας ο οποίος δείχνει πάντοτε το επόμενο στοιχείο που θα τύχει διαχείρισης. Αρχικά $bp = $sp. 3 Άσκηση 1 (γ) Σε τι χρησιμεύει η Στοίβα στο Spim, Α) όσον αφορά στη ροή ενός προγράμματος Β) όσον αφορά στην άσκηση 3 Α) Για προσωρινή αποθήκευση του καταχωρητη $ra σε περιπτώσεις που έχουμε κλήση συνάρτησης μέσα από μια συνάρτηση και των καταχωρητών $s πριν από μια κλήση συνάρτησης που επαναχρησιμοποιεί κάποιον καταχωρητή από τους $s. Β) Στην άσκηση 3 χρησιμοποιήθηκε για να αποθηκεύει τον ascii κώδικα των παρενθέσεων και στη συνέχεια να τον ανακτά για να τον συγκρίνει με την κλειστή παρένθεση που βρέθηκε. 4
Άσκηση 2 (α) Περιγράψτε με λόγια τη διαδικασία που ακολουθείται για την υλοποίηση της συνάρτησης PUSH. Βεβαιωθείτε ότι έχετε συμπεριλάβει και τους απαιτούμενους ελέγχους. 1. Έλεγχος εάν η Στοίβα έχει υπερβεί το όριο 2. Μείωση του δείκτη της Στοίβας (κατά 4 για word ήκατὰ1 για byte) 3. Αποθήκευση του νέου στοιχείου στη μνήμη 5 Άσκηση 2 (β) Περιγράψτε με λόγια τη διαδικασία που ακολουθείται για την υλοποίηση της συνάρτησης POP. Βεβαιωθείτε ότι έχετε συμπεριλάβει και τους απαιτούμενους ελέγχους πριν το διάβασμα από τη Στοίβα. 1. Έλεγχος εάν η Στοίβα είναι άδεια 2. Φόρτωση του νέου στοιχείου από τη μνήμη 3. Αύξηση του δείκτη της στοίβας (κατά 4 για word ήκατὰ1 για byte) 6
Άσκηση 2 (γ) Εξηγήστε γιατί πρέπει να οριοθετούμε τη Στοίβα στο Spim; Τι πρόβλημα μπορεί να προκύψει εάν δεν το κάνουμε; Η Στοίβα πρέπει να οριοθετείται γιατί διαφορετικά υπάρχει μεγάλη πιθανότητα να μπει σε άλλη περιοχή μνήμης και να σβήσει δεδομένα ή εντολές που είναι αποθηκευμένα εκεί. 7 Άσκηση 3 (α) Γράψτε ένα σύντομο πρόγραμμα το οποίο θα πραγματοποιεί POP ενός byte στον καταχωρητή $t6, αφού πρώτα κάνει τον απαιτούμενο έλεγχο για να βεβαιωθεί ότι υπάρχει κάποιο στοιχείο αποθηκευμένο στη Στοίβα. 1. beq $sp, $bp, empty_stack 2. lb $t6, ($sp) 3. addi $sp, $sp, 1 8
Άσκηση 3 (β) Γράψτε ένα σύντομο πρόγραμμα το οποίο θα πραγματοποιεί PUSH με το περιεχόμενο του καταχωρητή $t5, αφού πρώτα κάνει τον απαιτούμενο έλεγχο για να βεβαιωθεί ότι υπάρχει ο απαιτούμενος χώρος στη Στοίβα. 1. beq $sp, $t9, stack_overflow 2. addi $sp, $sp, -4 3. sw $t5, ($sp) 4. # $t9 holds the last address before stack overflows 9 Άσκηση 3 (γ) Δίνονται τα περιεχόμενα των καταχωρητών και της μνήμης ως ακολούθως: $t0 = 0Χ50000000 $t1= 0ΧΑΒ012345 0x50000000: 0x78 0x50000001: 0x56 0x50000002: 0x12 0x50000003: 0xΒ2 Δείξτε τι θα αλλάξει μετά από κάθε εντολή (η κάθεεντολή είναι ανεξάρτητη): 1. lb $t3, 0x50000003 $t3 = 0Χ000000Β2 2. sw $t1, 0x50000000 Θέσεις μνήμης 0x50000000-3 = 0x45, 0x23, 0x01 ΑΒ 3. la $t8, 0x50000000 $t8 = 0x50000000 4. move $t0, $t1 $t0 = 0ΧΑΒ012345 10
Άσκηση 4 (α) Δίνονται τα περιεχόμενα των καταχωρητών και της μνήμης ως ακολούθως: $t0 = 0Χ50000000 $t1=0χαβ012345 0x50000000: 0x78 0x50000001: 0x56 0x50000002: 0x12 0x50000003: 0xΒ2 Δείξτε τι θα αλλάξει μετά από κάθε εντολή (η κάθεεντολήείναι ανεξάρτητη): 1. lb $t3, 0x50000003 $t3 = 0Χ00000012 2. li $t4, 0x50000001 $t4 = 0x50000001 3. la $t8, 0x50000000 $t8 = 0x50000000 4. lw $t5, ($t0) $t5 = 0xΒ2125678 5. sb $t0, 2($t1) Θέση Μνήμης 0ΧΑΒ012347 = 00 6. sw $t1, 0x50000002 Θέσεις Μνήμης 0x50000002-5 = 0Χ45, 0Χ23, 0Χ01, ΑΒ 7. move $t0, $t1 $t0 = 0ΧΑΒ012345 11 Άσκηση 4 (β) Δίνονται τα περιεχόμενα των καταχωρητών και της μνήμης ως ακολούθως: $t0 = 0Χ60000000 $t1=0χαβ012345, 0x60000000: 0x18 0x60000001: 0x56 0x60000003: 0x12 0x60000002: 0x1Α Δείξτε τι θα αλλάξει μετά από κάθε εντολή (η κάθεεντολήείναι ανεξάρτητη): 1. lb $t3, 0x60000003 $t3 = 0X00000012 2. li $t8, 0x60000001 $t8 = 0x60000001 3. la $t4, 0x60000000 $t4 = 0x60000000 4. lw $t5, 0x60000000 $t5 = 0x12561Α18 5. sb $t0, 2($t1) Θέση Μνήμης 0ΧΑΒ012347 = 00 6. sw $t1, 4($t0) Θέσεις Μνήμης 0x60000004-7 = 0Χ45, 0Χ23, 0Χ01, ΑΒ 7. move $t1, $t0 $t1 = 0Χ60000000 12
Άσκηση 4 (γ) Γράψτε ένα πρόγραμμα το οποίο θα πραγματοποιεί ανταλλαγή μεταξύ των καταχωρητών $t1 και $t2, με την χρήση της Στοίβας (PUSH και POP). Θα πρέπει να κάνετε και τους απαιτούμενους ελέγχους προτού αποθηκεύσετε ή πάρετε κάποιο στοιχείο από τη Στοίβα. 13 Άσκηση 4 (γ) 1. # $t9 holds the 4th address before stack overflows 2. beq $sp, $t9, stack_overflow # check for stack overflow 3. addi $sp, $sp, -4 # move stack pointer down 4. sw $t1, ($sp) # place $t1 on stack 5. beq $sp, $t9, stack_overflow # check for stack overflow 6. addi $sp, $sp, -4 # move stack pointer down 7. sw $t2, ($sp) # place $t2 on stack 8. beq $sp, $bp, empty_stack # check for empty stack 9. lw $t1, ($sp) # load $t1 from memory ($sp) 10.addi $sp, $sp, 4 # move stack pointer up 11.beq $sp, $bp, empty_stack # check for empty stack 12.lw $t2, ($sp) # load $t2 from memory ($sp) 13.addi $sp, $sp, 4 # move stack pointer up 14