Οργάνωση και Σχεδίαση Υπολογιστών Η Διασύνδεση Υλικού και Λογισμικού, 4 η έκδοση QtSpim Σύντομη Εισαγωγή στη χρήση του προσομοιωτή και συμβολομεταφραστή (Τελευταία ενημέρωση για την έκδοση QtSpim 9.1.4)
QtSpim Χρησιμοποιούμε την τελευταία έκδοση 9.1.4 Υπάρχουν εκδόσεις για Windows, Linux, Mac http://sourceforge.net/projects/spimsimulator/files/ Είναι το πιο πρόσφατο περιβάλλον προσομοίωσης και συμβολομετάφρασης που βασίζεται στον Spim του James Larus Από το 1990 QtSpim 2
Παράθυρα Ο QtSpim έχει δύο παράθυρα: κεντρικό (QtSpim) κονσόλα (Console) δίνουμε είσοδο από το πληκτρολόγιο και παίρνουμε έξοδο του προγράμματός μας Το κεντρικό παράθυρο δείχνει Τα περιεχόμενα των καταχωρητών Ακεραίων (Int Regs) και Κινητής υποδιαστολής (FP Regs) Τα περιεχόμενα της μνήμης Τμήμα δεδομένων (Data) Τμήμα εντολών (Text) λέγεται και «κείμενο» QtSpim 3
Παράθυρα (συνέχεια) QtSpim 4
Τι δείχνει το Text segment [Διεύθυνση] Δεκαεξαδικό περιεχόμενο (8 x 4 bit = 32 bit) Πραγματικές εντολές MIPS (μία σε κάθε λέξη) Πηγαίος κώδικας (περιέχει ψευδοεντολές) QtSpim 5
Τι δείχνει το Data segment [Διεύθυνση] Δεκαεξαδικό περιεχόμενο ASCII χαρακτήρες Όταν δεν είναι εκτυπώσιμοι δείχνει τελείες QtSpim 6
Μενού File Φόρτωση αρχείου Πρόσφατα αρχεία Αρχικοποίηση προσομοιωτή και Φόρτωση αρχείου Αποθήκευση log file Εκτύπωση Έξοδος QtSpim 7
Μενού Simulator Μηδενισμός καταχωρητών Αρχικοποίηση προσομοιωτή Εκτέλεση (F5) Παύση Διακοπή Βηματική εκτέλεση (F10) Ρυθμίσεις QtSpim 8
Ρυθμίσεις/Settings του MIPS Επιλέξτε Simple Machine QtSpim 9
Ρυθμίσεις/Settings του QtSpim Είναι διακοσμητικές (γραμματοσειρές και χρώματα) QtSpim 10
Προσοχή Exception handler Simulator Settings Να μην είναι επιλεγμένο το Load Exception Handler (για να εκτελούνται τα προγράμματα με τη μορφή που τα γράφουμε) QtSpim 11
Μενού Registers Σε ποιο σύστημα αρίθμησης θα δείχνει το περιεχόμενο των καταχωρητών Binary Hexadecimal Decimal QtSpim 12
Μενού Text/Data Segment Ρυθμίσεις για τα παράθυρα που δείχνουν την περιοχή μνήμης του κώδικα (Text Segment) και την περιοχή μνήμης των δεδομένων (Data Segment) Χρήστης/User Το δικό μας πρόγραμμα/δεδομένα/στοίβα (user text/data/stack) Πυρήνας/Kernel Ο κώδικας και τα δεδομένα του λειτουργικού συστήματος (kernel text/data) QtSpim 13
Διευθύνσεις μνήμης Τα δεδομένα του χρήστη αρχίζουν στη δεκαεξαδική διεύθυνση 0x10000000 (δεκαδικό 268.435.456). Ο κώδικας του χρήστη αρχίζει στη δεκαεξαδική διεύθυνση 0x00400000 (δεκαδικό 4.194.304) QtSpim 14
Μενού Window Ποια παράθυρα θα είναι ενεργά QtSpim 15
Μενού Help Καταπληκτικό μενού βοήθειας Επιλέξτε View Help Περιέχει τα πάντα Μάθετε να διαβάζετε το Help σε όλα τα εργαλεία Χρυσός κανόνας των υπολογιστών When everything fails, read the instructions QtSpim 16
Που γράφουμε τον κώδικά μας; Μόνο σε text editor (Notepad στα Windows, Notepad++ κτλ ή Gedit) Όχι σε επεξεργαστή κειμένου (Word) Έχει ειδικούς χαρακτήρες Τα αρχεία assembly MIPS έχουν κατάληξη.s QtSpim 17
Πρόγραμμα hello-world.s.text.globl start start: # execution starts here la $a0,message # system call to print li $v0,4 # the message syscall li $v0,10 syscall # au revoir....data message:.asciiz "hello world" QtSpim 18
Τμήματα.text και.data.text Περιέχει τον κώδικα.data Περιέχει τα δεδομένα QtSpim 19
Ψευδοεντολές la και li la load address Φορτώνει σε καταχωρητή τη διεύθυνση ενός δεδομένου (μεταβλητής ή πίνακα) la $a0,message Φορτώνει στον $a0 τη διεύθυνση της συμβολοσειράς message li load immediate Φορτώνει σε καταχωρητή μια σταθερή τιμή li $v0,4 Βάζει τη τιμή 4 στον $v0 QtSpim 20
Κλήση συστήματος Syscall Πρέπει να μπουν (με la και li) τιμές σε κάποιους καταχωρητές για να καθοριστεί η λειτουργία που θέλουμε να γίνει Στον $v0 μπαίνει ο «κωδικός» της λειτουργίας Στους $a0-$a3 (ή στον $f12 για λειτουργίες κινητής υποδιαστολής) μπαίνουν οι παράμετροι της λειτουργίας Λίστα λειτουργιών ακολουθεί αναλυτική εξήγηση στο Help και στο βιβλίο QtSpim 21
Κωδικοί 1-9 (στον $v0) Service System Arguments Result call code print_int 1 $a0 = integer print_float 2 $f12 = float print_double 3 $f12 = double print_string 4 $a0 = string read_int 5 integer (in $v0) read_float 6 float (in $f0) read_double 7 double (in $f0) read_string 8 $a0 = buffer, $a1 = length sbrk 9 $a0 = amount address (in $v0) QtSpim 22
Κωδικοί 10-17 (στον $v0) Service System Arguments Result call code exit 10 print_char 11 $a0 = char read_char 12 char (in $a0) open 13 $a0 = filename (string), file descriptor $a1 = flags, $a2 = mode (in $a0) read 14 $a0 = file descriptor, num chars read $a1 = buffer, (in $a0) $a2 = length write 15 $a0 = file descriptor, $a1 = buffer, $a2 = length close 16 $a0 = file descriptor exit2 17 $a0 = result num chars written (in $a0) QtSpim 23
Το syscall 10 Κάθε πρόγραμμα πρέπει να τελειώνει με κλήση του syscall 10...... li $v0,10 syscall # au revoir... QtSpim 24
Οδηγίες (directives).asciiz str αποθηκεύει τη συμβολοσειρά str στη μνήμη και την τερματίζει με το μηδενικό (null) χαρακτήρα (όπως η C)..byte b1,..., bn αποθηκεύει τις n τιμές σε διαδοχικά byte της μνήμης..half h1,..., hn αποθηκεύει τις n 16-bit ποσότητες σε διαδοχικές ημιλέξεις (halfwords) της μνήμης. QtSpim 25
Οδηγίες (directives) (συνεχ.).word w1,..., wn αποθηκεύει τις n 32-bit ποσότητες σε διαδοχικές λέξεις μνήμης..float f1,..., fn αποθηκεύει n αριθμούς κινητής υποδιαστολής απλής ακρίβειας σε διαδοχικές θέσεις μνήμης (4 byte για κάθε αριθμό)..double d1,..., dn αποθηκεύει n αριθμούς κινητής υποδιαστολής διπλής ακρίβειας σε διαδοχικές θέσεις μνήμης (8 byte για κάθε αριθμό). QtSpim 26
Οδηγίες (directives) (συνεχ.).globl sym η ετικέτα sym είναι καθολική (global) και μπορεί να αναφερθεί από άλλα αρχεία..space n δεσμεύει χώρο n byte στο τρέχον τμήμα (πρέπει να είναι το τμήμα δεδομένων στον SPIM) QtSpim 27
Big endian Little endian Ο πραγματικός επεξεργαστής MIPS είναι big endian (δηλαδή η διεύθυνση κάθε λέξης των 4 byte δείχνει το byte που αποθηκεύει το υψηλότερης σημαντικότητας byte της λέξης) Όμως ο QtSpim ακολουθεί την οργάνωση του υπολογιστή στον οποίο εκτελείται Έτσι σε ένα PC, ο QtSpim αποθηκεύει τις λέξεις με την little endian οργάνωση των byte τους QtSpim 28
Φόρτωση προγράμματος Αφού έχουμε σώσει το αρχείο στο Notepad Καλούμε File Load File Επιλέγουμε το αρχείο.s και Open QtSpim 29
Επαναφόρτωση προγρ/τος Προσοχή! Όταν κάνουμε διορθώσεις θέλει αρχικοποίηση ο προσομοιωτής Αποθηκεύουμε το διορθωμένο αρχείο.s Επιλέγουμε File Reinitialize and Load File ή ξεχωριστά Simulator Reinitialize Simulator File Load File QtSpim 30
Εκτέλεση προγράμματος Simulator Run/Continue (F5) Εκτέλεση μέχρι τέλους Simulator Single Step (F10) Εκτέλεση ανά μία εντολή QtSpim 31
Σημεία διακοπής - Breakpoints Στην εντολή που θέλουμε να ορίσουμε breakpoint ανοίγουμε (με δεξί κλικ) το αναδυόμενο μενού και επιλέγουμε Set Breakpoint Η εκτέλεση (F5) θα σταματήσει εκεί για να δούμε καταχωρητές, μνήμες. QtSpim 32
Παράδειγμα πρόσθεση... start:.text.globl start # execution starts here la $t0,num1 lw $s1,0($t0) # num1 is in $s1 la $t0,num2 lw $s2,0($t0) # num2 is in $s2 add $s3,$s1,$s2 # add them la $t0,sum sw $s3,0($t0) # result is in sum li $v0,10 syscall # au revoir....data num1:.word 15 # memory word for first number num2:.word 25 # memory word for second number sum:.word 0 # memory word for their sum QtSpim 33
Η μνήμη πριν την εκτέλεση sum = 0 num1 = 15 δεκαδικό = f δεκαεξαδικό num2 = 25 δεκαδικό = 19 δεκαεξαδικό (16 + 9 = 25) QtSpim 34
Η μνήμη μετά την εκτέλεση num1 = 15 δεκαδικό = f δεκαεξαδικό sum = 40 δεκαδικό = 28 δεκαεξαδικό num2 (2*16 + 8 = 40) = 25 δεκαδικό = 19 δεκαεξαδικό (16 + 9 = 25) QtSpim 35
Περισσότερα Στο Help του QtSpim Πολύ λεπτομερές Στο Παράρτημα Β του βιβλίου μας QtSpim 36