Τ.Ε.Ι. Κρήτης Τμ. Μηχανικών Πληροφορικής Αρχιτεκτονική Υπολογιστών Τ.Ε.Ι. Κρήτης Τμ. Μηχανικών Πληροφορικής Αρχιτεκτονική Υπολογιστών 8ο Μάθημα
Διευθύνσεις Bytes Όροι που είχαμε δει σε προηγούμενο μάθημα: MIPS Byte Addressable όπου κάθε διεύθυνση μνήμης αναφέρονται σε bytes 32-bit λέξη (π.χ. Ακέραιος) καταλαμβάνει 4 bytes στη μνήμη Αν είχαμε πίνακα χαρακτήρων (θα δούμε παρακάτω τι είναι) ο κάθε χαρακτήρας καταλαμβάνει 1 byte σύμφωνα με τον κωδικοποίηση ASCII
Περιορισμοί Ευθυγράμμισης Σημαίνει ότι μια ποσότητα Ν bytes επιβάλλεται να έχει διεύθυνση η οποία θα είναι ακέραιο πολλαπλάσιο του Ν Όπως έχουμε πει το Ν είναι δύναμη του 2. Άρα η τιμή αποθηκεύεται στα λιγότερο σημαντικά στοιχεία (least significant bits – LSB) και τα υπόλοιπα bits γεμίζουν με μηδενικά (ακολουθεί παράδειγμα)
Αρίθμηση των Bytes Είναι αναγκαίο όταν αποθηκεύεται στη μνήμη μια ποσότητα από πολλαπλά bytes (π.χ. Ένας ακέραιος), να καθορίζεται με ποιά σειρά αριθμούνται (διευθυνσιοδοτούνται) αυτά τα επιμέρους bytes μέσα στη ποσότητα αυτή. Υπάρχει ασυμφωνία ανάμεσα στις μεγάλες εταιρίες σχετικά με αυτή την αρίθμηση. Για αυτό υπάρχουν δύο τύποι επεξεργαστών σήμερα: “Big-endian” “Little-endian”
Έστω ότι... Big-Endian Machine LS MS κ ρ ή τ η \0 Ο αριθμός 2003 σε Binary (Σε hex: 7D3) 00000000 Byte 12: 00000000 Byte 13: 00000111 Byte 14: 11010011 Byte 15: Word 12: κ Byte 16: ρ Byte 17: ή Byte 18: τ Byte 19: Word 16: Σε κάθε byte και χαρακτή- ρας η Byte 20: \0 Byte 21: Byte 22: Byte 23: Word 20: Byte 24: Byte 25: Byte 26: Byte 27: Word 24: Null Χαρ/ρας
Έστω ότι... Little-Endian Machine LS MS τ ή ρ κ \0 η Ο αριθμός 2003 σε Binary (Σε hex: 7D3) 00000000 Byte 15: 00000000 Byte 14: 00000111 Byte 13: 11010011 Byte 12: Word 12: τ Byte 19: ή Byte 18: ρ Byte 17: κ Byte 16: Word 16: Σε κάθε byte και χαρακτή- ρας Byte 23: Byte 22: \0 Byte 21: η Byte 20: Word 20: Byte 27: Byte 26: Byte 25: Byte 24: Word 24: Νull Χαρ/ρας
ASCII code
Ας δοκιμάσουμε ένα πρόγραμμα..! Γράψτε ένα πρόγραμμα σε assembly mips το οποίο να ζητάει από τον χρήστη να δώσει 2 χαρακτήρες. Να αποθηκεύει τους χαρακτήρες σε ένα πίνακα ‘input’. Το πρόγραμμα να τυπώνει "Edwses 'a'." εάν ο πρώτος χαρακτήρας είναι ο ‘a’ και "Edwses 'b'." εάν ο δεύτερος είναι ο ‘b’. Τα "Edwses 'a'." και "Edwses 'b'." να εμφανιζονται σε διαφορετικες γραμμες.
.globl main .data str1: .asciiz " dose xaraktires : " str2: .asciiz "edwses 'a' " str3: .asciiz "edwses 'b' " ##oi metavlites simvoloseirwn stre: .asciiz "end" strln: .asciiz "\n " .align 2 ## Xorizoume tin mnimi se 2^2 = 4 kommatia input: .space 3 ## o pinakas input pernei 2 xarakthres kai allh ## mia timh to /0 .text ## Kirios kodikas .globl main .globl l1 .globl l2 main: addi $2,$0,4 la $4,str1 ## ”dose xaraktires:” syscall
lb = load byte. Ανάλογη εντολή με το lw που έχουμε μάθει. addi $2,$0,8 ##Attribute 8: DIAVAZEI SIMVOLOSEIRA apo console la $4,input ##Me to pseydoinstruction xserei oti tha diavasei 3 ##char apo console addi $5,$0,3 ##Edo tou dilonoume oti o pinakas tha exei 3 ##stoixeia mazi me to \0 syscall ##Klisi anagnosis char addi $2,$0,4 la $4,strln syscall la $8,input ##Ta periexomena toy input mpainoyn ston $8 lb $9,0($8) ##Diavazei to proto byte tou $8 kai to vazei sto $9 lb $10,1($8) ##Diavazei to deutero byte tou $8 k to vazei sto $10 addi $11,$0,97##fortonei to ASCII tou ‘a’ dec:97(hex 61) ston $11 addi $12,$0,98##Fortonei to ASCII tou ‘b’ dec:98(hex 62) ston $12 Εδώ λέμε στον MIPS να πάει από τη πρώτη θέση της μνήμης του πίνακα input να διαβάσει τα περιεχόμενά του και να τα αποθηκεύσει στον $9 lb = load byte. Ανάλογη εντολή με το lw που έχουμε μάθει.
beq $9,$11,l1 ##An $9 == $11, branch sto l1 beq $10,$12,l2 ##An $10 == $12, branch sto l1 j end l1: addi $2,$0,4 la $4,str2 syscall la $4,strln beq $10,$12,l2
l2: addi $2,$0,4 la $4,str3 syscall end: la $4,strln la $4,stre
Παράδειγμα 2 Φτιάξτε ένα πρόγραμμα το οποίο να διαβάζει και να καταχωρεί σε 2 καταχωρητές 2 αριθμούς. Στη συνέχεια να ζητάει τον χαρακτήρα ‘+’ για την πρόσθεση και τον χαρακτήρα ‘-’ για αφαίρεση. Όταν ο χρήστης δίνει από την κονσόλα το ‘+’ να υπολογίζεται και να τυπώνεται το άθροισμα των δύο παραπάνω αριθμών. Όταν δίνει ‘-’ να υπολογίζεται και να τυπώνεται η διαφορά τους. Αν ο χρήστης δώσει «κατα λάθος» άλλον ascii χαρακτήρα εκτός από τους αποδεκτούς πρέπει να εμφανίζεται ένα μύνημα λάθους και να ξαναδίνει ο χρήστης το σωστό σύμβολο.