ΗΜΥ 213 Εργαστήριο Οργάνωσης Ηλεκτρονικών Υπολογιστών και Μικροεπεξεργαστών Διδάσκων: Δρ. Γιώργος Ζάγγουλος Email: zaggoulos.george@ucy.ac.cy www.ece.ucy.ac.cy/courses/ece213
Ορίσματα στο QtSpim (set parameters in QtSpim) Τα ορίσματα στο QtSPIMμπορούν να δοθούν από την επιλογή Run Parameters που βρίσκεται στο μενού simulator στον προσομοιωτή QtSpim. Το αποτέλεσμα της πιο πάνω ενέργειας είναι η αλλαγή στην τιμή του καταχωρητή$a0, ο οποίος θα πάρει το πλήθος των ορισμάτων που δώσαμε (διαχωρισμένα μεταξύ τους με κενό). Μέσω του καταχωρητή$a1, μπορούμε να βρούμε τη διεύθυνση στην οποία έχει αποθηκευτεί το κάθε όρισμα (ως 32-μπιτος αριθμός) $a0 = 2έχει τοπλήθος ορισμάτων $a1 = δείκτης μνήμης,έχει την αρχική διεύθυνση όπου αποθηκεύτηκε το 1 ο όρισμα (όνομα του αρχείου) 4($a1) =δείκτης μνήμηςέχει την αρχική διεύθυνση όπου αποθηκεύτηκε o asciiκώδικας του 2 ου ορίσματος (1 ο όρισμα που δόθηκε στο Run Parameters) π.χ. για 5, αποθηκεύεται 0x35 Πως μπορούμε να διαβάσουμε την τιμή που δόθηκε από το Run parameters ως αριθμό(και όχι ως κώδικα ascii); 2
Μετατροπή ASCII σε Δεκαδικό αριθμό Οι χαρακτήρες 431 είναι αποθηκευμένοιστη μνήμη ως: 0x34,0x33και0x31. Με ποιο τρόπο μπορεί να μετατραπεί αυτή η ακολουθία χαρακτήρων σε αριθμό 431; Το 431 ισούται με 4*100 + 3*10 + 1 1. Πως μπορώ να καταλήξω στο 400? Πολλαπλασιάζοντας το 4δύο φορές με το 10(4x10x10) 2. Πως θα καταλήξω στο 30? Πολλαπλασιάζοντας το 3μία φορά με το 10(3x10) 3. Πως θα καταλήξω στο 1? Πολλαπλασιάζοντας το 1μηδένφορές με το 10 3
Αλγόριθμος 4
ASCII 431 ToInteger 431 1. Θέτουμε αρχικά κάποιον καταχωρητή=0 2. Αφαιρούμε 0χ30 από τον 1 ο χαρακτήρα για να μετατραπεί σε αριθμό 3. Πολλαπλασιάζουμε το Result x 10 4. Προσθέτουμε το νέο ψηφίο στο Result 5. Ο επόμενος χαρακτήρας είναι αριθμητικός? ΌΧΙ: τελείωσε η μετατροπή του σε αριθμό! ΝΑΙ: επαναλαμβάνονται τα βήματα 2-5 για τον επόμενο αριθμητικό χαρακτήρα 5 Reg = 4 Reg = 0 0x34 0x30 = 0x4 Reg = Reg x 10 = 0 Reg = Reg + 4 = 4 2. 0x33 0x30 = 0x3 = 3 3. Reg = Reg x 10 = 4 x 10 =40 4. Reg = Reg + 3= 43 Reg = 43 2. 0x31 0x30 = 0x1 = 1 3. Reg = Reg x 10 = 43 x 10 = 430 4. Reg = Reg + 1 = 431
Μετατροπή χαρακτήρων ASCII σε ακέραιο 6 Ο πιο κάτω κώδικας μετατρέπει το 2 ο όρισμα (δηλ. το 1 ο που εισάγεται από τo Run Parameters του QtSpim) σε integer και τον εκτυπώνει στην οθόνη. main: 1. bne $a0, 2, error1 # έλεγχος αριθμού ορισμάτων 2. li $t3, 10 # αρχικοποίηση $t3 με δέκα 3. move $s0, $zero # αρχικοποίηση $s0 με μηδέν 4. lw $t0, 4($a1) # η θέση μνήμης ($α1) + 4 κρατά το LS Byte # της διεύθυνσης του 2 ου ορίσματος atoi: 5. lb $s1, ($t0) # $s1 παίρνει το σημαντικότερο ψηφίο 6. bgt $s1, 0x39, done # ελέγχει αν είναι> ascii 9 7. blt $s1, 0x30, done # ελέγχει αν είναι< ascii 0 8. sub $s1, $s1, 0x30 # αφαιρεί 0x30(48)για να βρει την τιμή του 9. mul $s0, $s0, $t3 # πολλαπλασιάζει με τo 10 10. add $s0, $s0, $s1 # προσθέτει το νέο ψηφίο 11. addi $t0, $t0, 1 # αυξάνει το δείκτη της μνήμης 12. b atoi # συνεχίζει από την αρχή της atoi
Μετατροπή χαρακτήρων ASCII σε ακέραιο error1: 13. li $v0, 4 14. la $a0, invalid_arg # εκτύπωση του μηνύματος 15. syscall 16. b exit_p done: 17. li $v0, 1 18. move $a0, $s0 # εκτύπωση του αριθμού (integer) 19. syscall exit_p: 20. li $v0, 10 21. syscall # τέλος προγράμματος 7
Διάβασμα Αρχείου από το SPIM Οι διαδικασίες ου αφορούν ροσ έλαση αρχείων γίνονται με τηνβοήθειαsystem calls. ΠΡΟΣΟΧΗ! Στο εγχειρίδιο του SPIM ου έχετε, λανθασμένα αναφέρειότιοιτιμέςε ιστροφής(result) τωνsystem calls ροσ έλασης αρχείων βρίσκονται στον $a0. Στην ραγματικότητα οι τιμές αυτές το οθετούνται μετά την κλήση τους στον $v0. 8
Άνοιγμα και Ανάγνωση Αρχείου 9 Άνοιγμα A44 $v0 = 13 $a0 = full path του αρχείου (string) $a1 = flags, $a2 = UNIX octal file mode (0644 for rw-r--r--) When done then >>> $v0 = file descriptor (not $a0) Ανάγνωση $v0 = 14 $a0 = file descriptor, $a1 = buffer address, $a2 = amount of bytes to read When done then >>>>> $v0 = amount of data in buffer from file (-1 = error, 0 = end of file)
Εγγραφή και Κλείσιμο Αρχείου Εγγραφή $v0 = 15 A44 $a0 = file descriptor, $a1 = buffer address, $a2 = amount to write in bytes When done then >>>>>> $v0 = amount of data in buffer to file (-1 = error, 0 = end of file) Κλείσιμο $v0 = 16 $a0 = file descriptor 10
Flags and Modes Flags Read = 0x0, Write = 0x1, Read/Write = 0x2 Modes 0x0(User)(Group)(Other) Σε κάθε NIBBLE (4 bits) χρησιμοποιούμε τα πρώτα LSBitsγια να «Σημειώσουμε» με 1 την ιδιότητα. Στην πρώτη θέση του NIBBLEορίζεται η «Εκτέλεση», ακολούθως η «Εγγραφή» και ακολούθως η «Ανάγνωση». Αν δηλαδή για τον ιδιοκτήτη του αρχείου θέλουμε ανάγνωση-εγγραφή αλλά ΌΧΙ εκτέλεση και για το GROUP και ΟTHERS θέλουμε μόνο ανάγνωση τότε: li $a2 0x0644 δηλαδή $a2= 0000..0000 0110 0100 0100 11
Άνοιγμα Αρχείου από το SPIM # ====== OPEN.txt FILE =========== 1. li $v0, 13 #syscall 13 to open file 2. la $a0, filename #pass to a0 the filename 3. li $a1, 0 #flags=0 (read only) 4. li $a2,0400 #mode (user only, read only ) 5. syscall 6. beq $v0, -1, no_file#check if file has open # flags: 0=read, 1=write, 2=read/write #mode (permissions): 7=111 = read/write/execute # ==== READ & SAVE txt file context in memory == 7. move $a0, $v0 #a0 = file descriptor 8. la $a1, static_mem#a1 = buffer (memory pointer) 9. li $a2, 1 #a2 = number of bytes to be read (length) #a2 = 1 in order to read character by char. 12
Διάβασμα Αρχείου από το SPIM next_charac: 10. li $v0, 14 # SYSCALL 14 TO READ FILE 11. syscall 12. beq $v0, 0, read_error # IF $v0=0, ERROR 13. lb $s2, ($a1) # LOAD 1 BYTE FROM MEMORY ($a1) 14. beq $s2, 0x23, close_file # CHECK FOR #" TO CLOSE FILE 15. addi $a1, $a1, 1 # MOVE POINTER TO MEMORY 16. addi $t3, $t3, 1 # TEXT FILE LENGTH COUNTER 17. b next_charac # GO BACK TO READ NEW CHARACTER # =========== CLOSE TEXT FILE =========== close_file: 18. li $v0, 16 # SYSCALL 16 TO CLOSE FILE 19. syscall 13
Μαθησιακοί Στόχοι Εργαστηριακών ασκήσεων week3 και week4 Χρήση Ορισμάτων στο QtSpim Μετατροπή χαρακτήρων ASCII σε αριθμό Άνοιγμα αρχείου (.txt) από το QtSpim Διάβασμα αρχείου και μεταφορά του περιεχομένου στη μνήμη. Επεξεργασία περιεχομένου (χαρακτήρες/ αριθμοί) 14