Μετατροπή χαρακτήρων ASCII σε αριθμό (atoi) & Άνοιγμα αρχείου μέσα από τo SPIM, διάβασμα, και αποθήκευση του περιεχομένου του στη μνήμη (Διάλεξη 3) 1
Μετατροπή χαρακτήρων ASCII σε ακέραιο Ο πιο κάτω κώδικας μετατρέπει το 2 ο όρισμα που εισάγεται από την γραμμή εντολών (του terminal) σε integer και τον εκτυπώνει στην οθόνη. main: 1. bne $a0, 2, error1 # έλεγχος αριθμού ορισμάτων 2. li $t3,, 10 # constant 10 for the multiplications 3. move $s0,, $zero # αρχικοποίηση $s0 με μηδέν 4. lw $t0, 4($a1) # θέση μνήμης ($α1) + 4 κρατά την # διεύθυνση του 2 ορίσματος (αριθμού) atoi: 5. lb $s1,, ($t0) # $s1 παίρνει το σημαντικότερο ψηφίο 6. beq $s1, 0,, done # ελέγχει αν είναι null 7. sub $s1, $s1, 48 # αφαιρεί 0x30 (48) για να βρει την τιμή του 8. mul $s0, $s0, $t3 # πολλαπλασιάζει με τo 10 9. add $s0, $s0, $s1 # προσθέτει το νέο ψηφίο 10. addi $t0, $t0, 1 # αυξάνει το δείκτη της μνήμης 11. b atoi # συνεχίζει από την αρχή της atoi 2
Μετατροπή χαρακτήρων ASCII σε ακέραιο error1: 12. li $v0, 4 13. la $a0, invalid_arg # εκτύπωση του μηνύματος 14. syscall 15. b exit_p done: 16. li $v0, 1 17. move $a0, $s0 # εκτύπωση του αριθμού (integer) 18. syscall exit_p: 16. li $v0, 101 19. syscall # τέλος προγράμματος 3
Διάβασμα Αρχείου από το SPIM Η διαδικασία ανάγνωσης από αρχείο είναι σχετικά απλή και ακολουθεί την φιλοσοφία που ακολουθείται αι στα UNIX/Linux συστήματα. Παρόμοιος είναι και ο τρόπος λειτουργίας των συναρτήσεων ανάγνωσης/ εγγραφής από/σε αρχείο στην C. Παραθέτουμε απλά ότι οι διαδικασίες που αφορούν προσπέλαση αρχείων γίνονται με την βοήθεια system calls με τα οποία είστε ήδη εξοικειωμένοι. Για βοήθεια ανατρέξτε και στα manual pages του SPIM στις σελίδες που αφορούν τα system calls. ΠΡΟΣΟΧΗ! Στο εγχειρίδιο του SPIM που έχετε, λανθασμένα αναφέρει ότι οι τιμές επιστροφής (result) των system calls προσπέλασης αρχείων βρίσκονται στον $a0, ενώ στην πραγματικότητα οι τιμές αυτές τοποθετούνται μετά την κλήση τους στον $v0. 4
Άνοιγμα Αρχείου από το 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 (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. 5
Διάβασμα Αρχείου από το SPIM next_charac: 10. li $v0, 14 # SYSCALL 14 TO READ FILE 11. syscall 12. beq $a0, 0, read_error # IF $a0=0, ERROR 13. lb $s2, ($a1) # LOAD 1 BYTE FROM MEMORY ($a1) 14. beq $s2, 59, 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 6
Μαθησιακοί Στόχοι 4 ης Εβδομάδας Μετατροπή χαρακτήρων ASCII σε αριθμό Άνοιγμα αρχείου (.txt) από το Spim Διάβασμα αρχείου και μεταφορά του περιεχομένου στη μνήμη. Επεξεργασία περιεχομένου (χαρακτήρες/ αριθμοί) 7