Αρχιτεκτονική Υπολογιστών Ι Επιλεγμένες εντολές και συναρτήσεις assembly Από το βιβλίο Αρχιτεκτονική Υπολογιστών & Προγραμματισμός Assembly (Συγγραφέας / Εκδότης : Παναγιώτης Παπάζογλου) Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 1
add τιμής Πρόσθεση περιεχομένου δύο καταχωρητών ή καταχωρητή και ακέραιας Σύνταξη add k1,k2,kt k1,k2 = καταχωρητής (όνομα καταχωρητή) kt = καταχωρητής (όνομα καταχωρητή) ή ακέραια τιμή Πραγματοποιείται πρόσθεση του περιεχομένου του καταχωρητή k2 και του καταχωρητή ή της ακέραιας τιμής kt και το αποτέλεσμα αποθηκεύεται στον καταχωρητή k1. Δηλαδή γίνεται η πράξη k1=k2+kt. Παράδειγμα #Πρόσθεση καταχωρητών add $t0,$t1,$t2 #$t0=$t1+$t2 #Πρόσθεση καταχωρητή και ακέραιας τιμής add $t0,$t1,4 #$t0=$t1+4 #Υλοποίηση της πρόσθεσης $t0=$t1+$t2+$t3 add $t0,$t1,$t2 add $t0,$t0,$t3 Αυτή η αριθμητική εντολή λειτουργεί ως ψευδοεντολή όταν το τρίτο όρισμα είναι ακέραιος αριθμός αφού η πραγματική εντολή είναι η addi. Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 2
sub Αφαίρεση περιεχομένου δύο καταχωρητών ή ακέραιας τιμής από καταχωρητή Σύνταξη sub k1,k2,kt k1,k2 = καταχωρητής (όνομα καταχωρητή) kt = καταχωρητής (όνομα καταχωρητή) ή ακέραια τιμή Πραγματοποιείται αφαίρεση του περιεχομένου του καταχωρητή ή της ακέραιας τιμής kt από τον καταχωρητή k2 και το αποτέλεσμα αποθηκεύεται στον καταχωρητή k1. Δηλαδή γίνεται η πράξη k1=k2-kt. Παράδειγμα #Αφαίρεση καταχωρητών sub $t0,$t1,$t2 #$t0=$t1-$t2 #Αφαίρεση ακέραιας τιμής από καταχωρητή sub $t0,$t1,4 #$t0=$t1-4 #Υλοποίηση της αφαίρεσης $t0=$t1-$t2-$t3 sub $t0,$t1,$t2 sub $t0,$t0,$t3 Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 3
mul Πολλαπλασιασμός περιεχομένου δύο καταχωρητών ή ακέραιας τιμής και καταχωρητή Σύνταξη mul k1,k2,kt k1,k2 = καταχωρητής (όνομα καταχωρητή) kt = καταχωρητής (όνομα καταχωρητή) ή ακέραια τιμή Πραγματοποιείται πολλαπλασιασμός του περιεχομένου του καταχωρητή ή της ακέραιας τιμής kt με τον καταχωρητή k2 και το αποτέλεσμα αποθηκεύεται στον καταχωρητή k1. Δηλαδή γίνεται η πράξη k1=k2*kt. Παράδειγμα #Πολλαπλασιασμός καταχωρητών mul $t0,$t1,$t2 #$t0=$t1*$t2 #Πολλαπλασιασμός ακέραιας τιμής και καταχωρητή mul $t0,$t1,4 #$t0=$t1*4 #Υλοποίηση του πολλαπλασιασμού $t0=$t1*$t2*$t3 mul $t0,$t1,$t2 mul $t0,$t0,$t3 Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 4
div (τρία ορίσματα) Σύνταξη Διαίρεση περιεχομένου δύο καταχωρητών ή καταχωρητή με ακέραια τιμή div k1,k2,kt k1,k2 = καταχωρητής (όνομα καταχωρητή) kt = καταχωρητής (όνομα καταχωρητή) ή ακέραια τιμή Πραγματοποιείται διαίρεση του περιεχομένου του καταχωρητή k2 με τον καταχωρητή ή την ακέραια τιμή kt και το αποτέλεσμα (πηλίκο) αποθηκεύεται στον καταχωρητή k1. Δηλαδή γίνεται η πράξη k1=k2/kt. Παράδειγμα #Διαίρεση καταχωρητών div $t0,$t1,$t2 #$t0=$t1/$t2 #Διαίρεση καταχωρητή με ακέραια τιμή div $t0,$t1,4 #$t0=$t1/4 Σημείωση Επειδή δουλεύουμε αποκλειστικά με ακέραια αριθμητική, τυχόν κλασματικό μέρος σε αποτέλεσμα δεν εμφανίζεται. Δηλαδή αν το αποτέλεσμα μιας διαίρεσης είναι για παράδειγμα 0.7 το αποτέλεσμα που θα πάρουμε θα είναι μηδέν (απόρριψη κλασματικού μέρους). Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 5
div (δύο ορίσματα) Διαίρεση περιεχομένου δύο καταχωρητών και αυτόματη αποθήκευση του αποτελέσματος Σύνταξη div k1,k2 k1,k2 = καταχωρητής (όνομα καταχωρητή) Πραγματοποιείται διαίρεση του περιεχομένου των καταχωρητών k1 και k2 και το αποτέλεσμα αποθηκεύεται αυτόματα στους καταχωρητές ειδικής χρήσης HI και LO (HI=Υπόλοιπο, LO=Πηλίκο). Παράδειγμα #Διαίρεση με ακέραια τιμή li $t2,2 #φόρτωση της ακέραιας τιμής για τη διαίρεση $t1/2 div $t1,$t2 Σημείωση Επειδή οι καταχωρητές HI και LO είναι ειδικής χρήσης δεν μπορούμε να χρησιμοποιήσουμε απευθείας το περιεχόμενό τους. Για να γίνει αυτό θα πρέπει να αντιγράψουμε το περιεχόμενό τους σε καταχωρητές γενικής χρήσης. Οι εντολές mfhi και mflo αντίστοιχα κάνουν αυτή τη δουλειά (π.χ. mfhi $t3 #$t3=[hi]). Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 6
li Σύνταξη Φόρτωση ακέραιας τιμής σε καταχωρητή li k,v Παράδειγμα k = καταχωρητής (όνομα καταχωρητή) v = ακέραια τιμή Η ακέραια τιμή v φορτώνεται στον καταχωρητή k (εκχώρηση τιμής). Το προηγούμενο περιεχόμενο του καταχωρητή k χάνεται (αντικατάσταση με τη νέα τιμή). #Φόρτωση θετικής τιμής li $v0,1 #v0=1 #Φόρτωση αρνητικής τιμής li $t1,-1 #Χρήση σε κλήση συνάρτησης li $v0,4 la $a0,msg.data msg:.asciiz Hello Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 7
Στο παραπάνω παράδειγμα η εντολή li $v0,4 χρησιμοποιείται για τον καθορισμό της συνάρτησης που θα κληθεί μέσω της εντολής. #Λανθασμένη χρήση li $t1,$t2 #Πρέπει να χρησιμοποιηθεί άλλη εντολή για τη #φόρτωση καταχωρητή από καταχωρητή move Σύνταξη Παράδειγμα Φόρτωση καταχωρητή από περιεχόμενο άλλου καταχωρητή move k1,k2 k1 = καταχωρητής προορισμού (όνομα καταχωρητή) k2 = καταχωρητής προέλευσης (όνομα καταχωρητή) Το περιεχόμενο του καταχωρητή k2 αντιγράφεται στον καταχωρητή k1. Έτσι, μετά την εκτέλεση της εντολής οι δύο καταχωρητές θα έχουν το ίδιο περιεχόμενο. #Φόρτωση move $t1,$v0 #$t1=$v0 #Χρήση σε κλήση συνάρτησης li $v0,1 move $a0,$t1 Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 8
Στο παραπάνω παράδειγμα η εντολή move $a0,$t1 χρησιμοποιείται για να τοποθετηθεί το περιεχόμενο του $t1 στον καταχωρητή $a0 προκειμένου να είναι δυνατή η εμφάνιση του $t1 στην οθόνη μέσω της συνάρτησης 1. la Σύνταξη Φόρτωση διεύθυνσης σε καταχωρητή la k, label k = καταχωρητής (όνομα καταχωρητή) label = συμβολική διεύθυνση (ετικέτα) Η πραγματική διεύθυνση που αντιστοιχεί στην ετικέτα label φορτώνεται στον καταχωρητή k. Οι ετικέτες αποτελούν χρήσιμα εργαλεία προκειμένου ο προγραμματιστής να οριοθετεί συγκεκριμένα σημεία στο πρόγραμμα. Το πρόγραμμα για να τρέξει απαιτεί τις πραγματικές διευθύνσεις που αντιστοιχούν στις ετικέτες. Η εντολή la μετατρέπει τις ετικέτες σε πραγματικές διευθύνσεις τις οποίες φορτώνει στο συγκεκριμένο καταχωρητή. Παράδειγμα #Φόρτωση διεύθυνσης la $t1, panayotis #$t1=διεύθυνση που αντιστοιχεί η ετικέτα #panayotis Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 9
#Χρήση σε κλήση συνάρτησης li $v0,4 la $a0,panayotis.data panayotis:.asciiz Hello Στο παραπάνω παράδειγμα η εντολή la $a0,panayotis χρησιμοποιείται για να πληροφορήσει τη συνάρτηση εμφάνισης αλφαριθμητικού για τη διεύθυνση που ξεκινά το αλφαριθμητικό (μήνυμα). lb Σύνταξη Φόρτωση ενός byte από τη μνήμη σε καταχωρητή lb k, addr k = καταχωρητής (όνομα καταχωρητή) addr = διεύθυνση μνήμης (συμβολική ή απόλυτη) Το περιεχόμενο της θέσης (1 byte) που αντιστοιχεί η διεύθυνση addr φορτώνεται στον καταχωρητή k. Ο καθορισμός της διεύθυνσης μπορεί να γίνει με συνδυασμό ετικέτας και καταχωρητή ή με χρήση του κατάλληλου δεκαεξαδικού αριθμού. Στην πρώτη περίπτωση το περιεχόμενο του καταχωρητή προστίθεται με τη διεύθυνση που αντιστοιχεί η ετικέτα προκειμένου να προσδιοριστεί η θέση της πληροφορίας. Στη δεύτερη περίπτωση γίνεται απευθείας χρήση της πραγματικής διεύθυνσης. Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 10
Παράδειγμα #Φόρτωση byte απευθείας από διεύθυνση lb $t1, 0x10000000 #$t1=[0x10000000] #Χρήση σε διάβασμα πίνακα lb $t1,pinakasa($s0).data pinakasa:.space 10 Στο παραπάνω παράδειγμα η εντολή lb $t1,pinakasa($s0) φορτώνει το byte που βρίσκεται στη διεύθυνση pinakasa+($s0). Έτσι, αν η ετικέτα pinakasa αντιστοιχεί στην αρχική διεύθυνση του πίνακα, ο καταχωρητής $s0 χρησιμοποιείται ως απόκλιση από αυτή τη θέση. lh Σύνταξη Φόρτωση δύο byte (μισή λέξη) από τη μνήμη σε καταχωρητή lh k, addr k = καταχωρητής (όνομα καταχωρητή) addr = διεύθυνση μνήμης (συμβολική ή απόλυτη) Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 11
Το περιεχόμενο δύο θέσεων μνήμης (2 byte) που ξεκινούν στη διεύθυνση addr φορτώνονται στον καταχωρητή k. Ο καθορισμός της διεύθυνσης μπορεί να γίνει με συνδυασμό ετικέτας και καταχωρητή ή με χρήση του κατάλληλου δεκαεξαδικού αριθμού. Στην πρώτη περίπτωση το περιεχόμενο του καταχωρητή προστίθεται με τη διεύθυνση που αντιστοιχεί η ετικέτα προκειμένου να προσδιοριστεί η αρχική θέση της πληροφορίας. Στη δεύτερη περίπτωση γίνεται χρήση απευθείας της πραγματικής διεύθυνσης. Παράδειγμα #Φόρτωση δύο byte απευθείας από διεύθυνση lh $t1, 0x10000000 #$t1=[0x10000000], [0x10000001] #Χρήση σε διάβασμα πίνακα lh $t1,pinakasa($s0).data pinakasa:.space 10 Στο παραπάνω παράδειγμα η εντολή lh $t1,pinakasa($s0) φορτώνει τα δύο byte ξεκινώντας από τη διεύθυνση pinakasa+($s0). Έτσι, αν η ετικέτα pinakasa αντιστοιχεί στην αρχική διεύθυνση του πίνακα, τα δεδομένα διαβάζονται από τις διευθύνσεις pinakasa+($s0) και pinakasa+($s0)+1 αντίστοιχα. lw Φόρτωση τεσσάρων byte (λέξη) από τη μνήμη σε καταχωρητή Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 12
Σύνταξη lw k, addr k = καταχωρητής (όνομα καταχωρητή) addr = διεύθυνση μνήμης (συμβολική ή απόλυτη) Το περιεχόμενο τεσσάρων θέσεων μνήμης (4 byte) που ξεκινούν στη διεύθυνση addr φορτώνονται στον καταχωρητή k. Ο καθορισμός της διεύθυνσης μπορεί να γίνει με συνδυασμό ετικέτας και καταχωρητή ή με χρήση του κατάλληλου δεκαεξαδικού αριθμού. Στην πρώτη περίπτωση το περιεχόμενο του καταχωρητή προστίθεται με τη διεύθυνση που αντιστοιχεί η ετικέτα προκειμένου να προσδιοριστεί η αρχική θέση της πληροφορίας. Στη δεύτερη περίπτωση γίνεται χρήση απευθείας της πραγματικής διεύθυνσης. Παράδειγμα #Φόρτωση ξεκινώντας από συγκεκριμένη διεύθυνση lw $t1, 0x10000000 # 0x10000000 έως 0x10000003 #Χρήση σε διάβασμα πίνακα lw $t1,pinakasa($s0).data pinakasa:.space 10 Στο παραπάνω παράδειγμα η εντολή lw $t1,pinakasa($s0) φορτώνει τα τέσσερα byte ξεκινώντας από τη διεύθυνση pinakasa+($s0). Έτσι, αν η ετικέτα pinakasa αντιστοιχεί στην αρχική διεύθυνση του πίνακα, τα δεδομένα διαβάζονται από τις διευθύνσεις pinakasa+($s0), pinakasa+ ($s0)+1, pinakasa+($s0)+2, και pinakasa+($s0)+3 αντίστοιχα. Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 13
sw Σύνταξη Αποθήκευση τεσσάρων byte (λέξη) από καταχωρητή στη μνήμη sw k, addr k = καταχωρητής (όνομα καταχωρητή) addr = διεύθυνση μνήμης (συμβολική ή απόλυτη) Ολόκληρο το περιεχόμενο του καταχωρητή k αποθηκεύεται στη μνήμη ξεκινώντας από τη διεύθυνση addr. Ο καθορισμός της διεύθυνσης μπορεί να γίνει με συνδυασμό ετικέτας και καταχωρητή ή με χρήση του κατάλληλου δεκαεξαδικού αριθμού. Στην πρώτη περίπτωση το περιεχόμενο του καταχωρητή προστίθεται με τη διεύθυνση που αντιστοιχεί η ετικέτα προκειμένου να προσδιοριστεί η αρχική θέση της πληροφορίας. Στη δεύτερη περίπτωση γίνεται χρήση απευθείας της πραγματικής διεύθυνσης. Παράδειγμα #Αποθήκευση καταχωρητή στη μνήμη sw $t1, 0x10000000 #αρχική διεύθυνση #Χρήση σε γέμισμα πίνακα sw $t1,pinakasa($s0).data pinakasa:.space 10 Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 14
Στο παραπάνω παράδειγμα η εντολή sw $t1,pinakasa($s0) αποθηκεύει το περιεχόμενο του καταχωρητή $t1 ξεκινώντας από τη διεύθυνση pinakasa+($s0). Έτσι, αν η ετικέτα pinakasa αντιστοιχεί στην αρχική διεύθυνση του πίνακα, τα δεδομένα αποθηκεύονται στις διευθύνσεις pinakasa+ ($s0), pinakasa+($s0)+1, pinakasa+($s0)+2, και pinakasa+ ($s0)+3 αντίστοιχα. Εμφάνιση ακέραιου αριθμού (Συνάρτηση 1) Εμφάνιση ακέραιου αριθμού στην οθόνη Προαπαιτούμενα Ο αριθμός της συνάρτησης πρέπει να φορτωθεί στον καταχωρητή $v0 ενώ ο αριθμός που πρόκειται να εμφανιστεί στον καταχωρητή $a0. Έξοδος Ο αριθμός εμφανίζεται στην οθόνη Σύνταξη (για κλήση συνάρτησης) li $v0,1 move $a0,k # ή άλλη εντολή φόρτωσης με προορισμό τον καταχωρητή #$a0 k = καταχωρητής (όνομα καταχωρητή) Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 15
Η συνάρτηση εμφανίζει στην οθόνη τον ακέραιο αριθμό που περιέχει ο καταχωρητής $a0. Ανάλογα την προέλευση της τιμής που πρόκειται να εμφανιστεί θα πρέπει να χρησιμοποιηθεί η κατάλληλη εντολής φόρτωσης. Χαρακτηριστικά είναι τα παραδείγματα που ακολουθούν. #Εμφάνιση περιεχομένου του καταχωρητή $t1 li $v0,1 move $a0,$t1 #Εμφάνιση του αριθμού 14 li $v0,1 li $a0,14 #Εμφάνιση της διεύθυνσης που ξεκινά το μήνυμα με την ετικέτα mes1 li $v0,1 la $a0,mes1 Διάβασμα ακέραιου αριθμού (Συνάρτηση 5) Διάβασμα ακέραιου αριθμού από το πληκτρολόγιο Προαπαιτούμενα Ο αριθμός της συνάρτησης πρέπει να φορτωθεί στον καταχωρητή $v0 Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 16
Έξοδος Ο αριθμός που διαβάστηκε αποθηκεύεται αυτόματα στον καταχωρητή $v0 Σύνταξη (για κλήση συνάρτησης) li $v0,5 Η συνάρτηση διαβάζει τον ακέραιο αριθμό που εισάγει ο χρήστης και τον αποθηκεύει αυτόματα στον καταχωρητή $v0. Σε περίπτωση που πρόκειται μετά την κλήση της συνάρτησης να χρησιμοποιηθεί αμέσως ξανά ο καταχωρητής $v0 θα πρέπει να φροντίσουμε ώστε να αποθηκεύσουμε προσωρινά το περιεχόμενό του σε κάποιο άλλο καταχωρητή. Έτσι, η κλήση της συνάρτησης με την προσωρινή αποθήκευση του ακέραιου αριθμού θα γίνει ως εξής: li $v0,5 move $t1,$v0 Παράδειγμα li $v0,5 move $t1,$v0 li $v0,5 move $t2,$v0 Στο παραπάνω παράδειγμα γίνεται ανάγνωση δύο αριθμών από το πληκτρολόγιο με αντίστοιχη αποθήκευση στους καταχωρητές $t1 και $t2. Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 17
Εμφάνιση αλφαριθμητικού (Συνάρτηση 4) Εμφάνιση μηνύματος στην οθόνη Προαπαιτούμενα Ο αριθμός της συνάρτησης πρέπει να φορτωθεί στον καταχωρητή $v0 και η αρχική διεύθυνση του μηνύματος (ετικέτα) στον καταχωρητή $a0. Έξοδος Εμφάνιση μηνύματος στην οθόνη Σύνταξη (για κλήση συνάρτησης) li $v0,4 la $a0,mes1 Η συνάρτηση εμφανίζει επιλεγμένο μήνυμα στην οθόνη. Το μήνυμα θα πρέπει να έχει δηλωθεί στην περιοχή data. Η δήλωση του μηνύματος συνοδεύεται από συμβολική ετικέτα η οποία χρησιμοποιείται από το πρόγραμμα για τον εντοπισμό του. Κατά την εκτέλεση του προγράμματος η ετικέτα μετατρέπεται σε πραγματική διεύθυνση. Παράδειγμα li $v0,4 la $a0,mes1 Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 18
li $v0,4 la $a0,mes2.data mes1:.asciiz HELLO-1\n mes2:.asciiz HELLO-2 Το παραπάνω παράδειγμα εμφανίζει στην οθόνη τα μηνύματα HELLO-1 και HELLO-2 σε διαφορετικές γραμμές. Διάβασμα αλφαριθμητικού (Συνάρτηση 8) Διάβασμα αλφαριθμητικού από το πληκτρολόγιο Προαπαιτούμενα Ο αριθμός της συνάρτησης πρέπει να φορτωθεί στον καταχωρητή $v0, η αρχική διεύθυνση στην οποία θα αποθηκευτεί το αλφαριθμητικό στον καταχωρητή $a0 και στον $a1 το μήκος του αλφαριθμητικού (μαζί με το χαρακτήρα τερματισμού). Έξοδος - Σύνταξη (για κλήση συνάρτησης) li $v0,8 la $a0,abuffer li $a1,11 Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 19
.data abuffer:.space 11 Το παραπάνω πρόγραμμα διαβάζει από το πληκτρολόγιο ένα αλφαριθμητικό μήκους 10 χαρακτήρων (+1 ένας για το χαρακτήρα τερματισμού) και το αποθηκεύει σε περιοχή μνήμης που ξεκινά από τη διεύθυνση abuffer. Τερματισμός προγράμματος (Συνάρτηση 10) Τερματισμός προγράμματος (έξοδος) Προαπαιτούμενα Έξοδος - Ο αριθμός της συνάρτησης απλά φορτώνεται στον καταχωρητή $v0. Σύνταξη (για κλήση συνάρτησης) li $v0,10 Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 20
ΠΑΡΑΡΤΗΜΑ Συνοπτικός οδηγός assembly Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 21
Συναρτήσεις Συνάρτηση Κωδικός κλήσης ($v0) Ορίσματα print_int 1 $a0 = ακέραιος print_string 4 $a0 = αλφαριθμητικό read_int 5 read_string 8 $a0 = αρχή περιοχής αποθήκευσης $a1 = μήκος αλφαριθμητικού exit 10 Η κλήση κάθε συνάρτησης προϋποθέτει τη χρήση της εντολής αφού προηγουμένως έχουν τοποθετηθεί τα απαιτούμενα ορίσματα Ντιρεκτίβες Συμβολισμός.ascii str.asciiz str Αποθήκευση αλφαριθμητικού στη μνήμη (χωρίς τον χαρακτήρα τερματισμού) π.χ..ascii Hello Αποθήκευση αλφαριθμητικού στη μνήμη (ακολουθούμενου από τον χαρακτήρα τερματισμού).byte b1,..., bn Αποθήκευση n byte συνεχόμενων στη μνήμη.data.space n.text Οριοθέτηση αρχής τμήματος δεδομένων Δέσμευση n bytes (περιοχή δεδομένων) Οριοθέτηση αρχής τμήματος κώδικα (μπορεί να δηλωθεί ως παράμετρος και η αρχική διεύθυνση του τμήματος) Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 22
Αριθμητικές εντολές add Rdest, Rsrc1, Src2 addi Rdest, Rsrc1, ακέραιος div Rsrc1, Rsrc2 div Rdest, Rsrc1, Src2 mul Rdest, Rsrc1, Src2 mult Rsrc1, Rsrc2 neg Rdest, Rsrc rem Rdest, Rsrc1, Src2 sub Rdest, Rsrc1, Src2 Rdest = Rsrc1 + Src2 Rdest = Rsrc1 + ακέραιος Rsrc1 / Rsrc2, HI=υπόλοιπο, LO=πηλίκο Rdest = Rsrc1 / Src2 (πηλίκο) Rdest = Rsrc1 * Src2 Rsrc1* Rsrc2, LO=χαμηλής τάξης word, HI=υψηλής τάξης word Rdest = - Rsrc Rdest = Rsrc1 / Src2 (υπόλοιπο) Rdest = Rsrc1 - Src2 Src2 = καταχωρητής ή αριθμητική τιμή (16 bit integer). Rdest, Rsrc1 = καταχωρητές Χειρισμός σταθερών li Rdest, ακέραιος Rdest = ακέραιος Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 23
Εντολές σύγκρισης seq Rdest, Rsrc1, Src2 sge Rdest, Rsrc1, Src2 sgt Rdest, Rsrc1, Src2 sle Rdest, Rsrc1, Src2 slt Rdest, Rsrc1, Src2 slti Rdest, Rsrc1, ακέραιος sne Rdest, Rsrc1, Src2 Rdest = 1 αν Rsrc1 ==Src2 και 0 σε άλλη περίπτωση Rdest = 1 αν Rsrc1 >= Src2 και 0 σε άλλη περίπτωση Rdest = 1 αν Rsrc1 > Src2 και 0 σε άλλη περίπτωση Rdest = 1 αν Rsrc1 <= Src2 και 0 σε άλλη περίπτωση Rdest = 1 αν Rsrc1 < Src2 και 0 σε άλλη περίπτωση Rdest = 1 αν Rsrc1 < ακέραιος και 0 σε άλλη περίπτωση Rdest = 1 αν Rsrc1 <> Src2 και 0 σε άλλη περίπτωση Src2 = καταχωρητής ή αριθμητική τιμή (16 bit ακέραιος). Rdest, Rsrc1 = καταχωρητές Εντολές διακλάδωσης b label Διακλάδωση στην εντολή που βρίσκεται στο label (χωρίς συνθήκη) beq Rsrc1, Src2, label Διακλάδωση στην εντολή που βρίσκεται στο label αν Rsrc1 == Src2 beqz Rsrc, label Διακλάδωση στην εντολή που βρίσκεται στο label αν Rsrc == 0 bge Rsrc1, Src2, label Διακλάδωση στην εντολή που βρίσκεται στο label αν Rsrc1 >= Src2 Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 24
bgez Rsrc, label Διακλάδωση στην εντολή που βρίσκεται στο label αν Rsrc >= 0 bgt Rsrc1, Src2, label Διακλάδωση στην εντολή που βρίσκεται στο label αν Rsrc1 > Src2 bgtz Rsrc, label Διακλάδωση στην εντολή που βρίσκεται στο label αν Rsrc > 0 ble Rsrc1, Src2, label Διακλάδωση στην εντολή που βρίσκεται στο label αν Rsrc1 <= Src2 blez Rsrc, label Διακλάδωση στην εντολή που βρίσκεται στο label αν Rsrc <= 0 blt Rsrc1, Src2, label Διακλάδωση στην εντολή που βρίσκεται στο label αν Rsrc1 < Src2 bltz Rsrc, label Διακλάδωση στην εντολή που βρίσκεται στο label αν Rsrc < 0 bne Rsrc1, Src2, label Διακλάδωση στην εντολή που βρίσκεται στο label αν Rsrc1 <> Src2 bnez Rsrc, label j label jr Rsrc jal label Src2=καταχωρητής ή ακέραιος. Rdest, Rsrc1 = καταχωρητές Διακλάδωση στην εντολή που βρίσκεται στο label αν Rsrc <> 0 Άλμα στην εντολή που βρίσκεται το label (χωρίς συνθήκη) Άλμα στην εντολή που βρίσκεται στη διεύθυνση που καθορίζεται από το περιεχόμενο του Rsrc (χωρίς συνθήκη) (jr $31 ή jr $ra για επιστροφή από υποπρόγραμμα που κλήθηκε με την εντολή jal label) Άλμα στην εντολή που βρίσκεται το label (αποθήκευση της διεύθυνσης επιστροφής στον καταχωρητή $31 ή $ra) Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 25
Εντολές φόρτωσης la Rdest, address lw Rdest, address Φόρτωση διεύθυνσης στον καταχωρητή Rdest Φόρτωση της λέξης (32 bit) από τη διεύθυνση address στον καταχωρητή Rdest Εντολές αποθήκευσης sw Rsrc, address Αποθήκευση του περιεχομένου του Rsrc ξεκινώντας από τη διεύθυνση address Εντολές αντιγραφής δεδομένων move Rdest, Rsrc mfhi Rdest mflo Rdest mthi Rdest mtlo Rdest Αντιγραφή των περιεχομένων του Rsrc στο Rdest Αντιγραφή των περιεχομένων του HI στον καταχωρητή Rdest Αντιγραφή των περιεχομένων του LO στον καταχωρητή Rdest Αντιγραφή των περιεχομένων του Rdest στον καταχωρητή HI Αντιγραφή των περιεχομένων του Rdest στον καταχωρητή LO Δρ. Παναγιώτης Παπάζογλου / Εργαστήριο Αρχιτεκτονική Υπολογιστών Ι / Σελίδα 26