gon1332 Δημοσ. 17 Μαΐου 2015 Δημοσ. 17 Μαΐου 2015 Γενικά.. τι πρέπει να κάνω? Ουπς, συγγνώμη. Λάθος μου, δε διάβασα καλά την εκφώνηση. Λοιπόν. Υποθέτω γνωρίζεις πως οι εντολές assembly MIPS χωρίζονται σε τρεις κατηγορίες: R, I και J. Εντολές τύπου R είναι αυτές που χρησιμοποιούν τρεις καταχωρητές. Εντολές τύπου I είναι αυτές που χρησιμοποιούν κι ένα immediate πεδιό, όπως η addi ή η lw. Εντολές τύπου J είναι αυτές που πραγματαοποιούν άμεσο άλμα, όπως η j. Οι εντολές αυτές είναι κυριολεκτικά ένα βήμα πριν το δυαδικό. Υποθέτω πως γνωρίζεις ότι οι υπολογιστές, πιο καλά οι επεξεργαστές μιλάνε σε δυαδικό. Άρα αυτές οι εντολές έχουν κάποια δυαδική μορφή που τις χαρακτηρίζει ώστε να τις καταλαβαίνει ο επεξεργαστής και να τις εκτελεί. Πως όμως μπορούμε να υπολογί- σουμε τη δυαδική μορφή μιας εντολής. Μπορούμε; Και βέβαια μπορούμε. Υπάρχουν προγράμματα που το κάνουν αυτό και λέγονται assemblers. Πως τις μετατ- ρέπουν λοιπόν; Το πρώτο πράγμα που πρέπει να γνωρίζουμε είναι πως όλες οι εντολές MIPS αναπαρίστανται από 32 bits. Ακολουθίες, δηλαδή από 32 δυαδικούς αριθμούς (1 ή 0). Αυτά τα 32 bits χωρίζονται, στη συνέχεια με συγκεκ- ριμένο τρόπο, ανάλογα την κατηγορία στην οποία ανήκει η κάθε εντολή (R, I, J) σε διάφορα πεδία. Οι εντολές, ανάλογα με τις κατηγορίες χωρίζονται έτσι: R: opcode | rs | rt | rd | shamt | fun bits 6 5 5 5 5 6 = 32 I: opcode | rs | rt | immediate bits 6 5 5 16 = 32 J: opcode | immediate bits 6 26 = 32 όπου opcode, operation code και fun δύο αριθμοί συνδυασμός των οποίων προκύπτει μία εντολή.Υπόψιν πως στις R εντολές, το opcode είναι 0. όπου shmat, shift amount, το οποίο γεμίζει, αν έχεις κάποια πράξη ολίσθησης όπου rd, rs, rt οι καταχωρητές. Προσοχή! Παίζει ρόλο η σειρά! Τώρα τι μένει να γνωρίζουμε; Πρέπει να έχουμε έναν πίνακα ο οποίος αναγράφει τους κωδικούς από το κάθε τί, ώστε να τα μεταφράσουμε. Το πιο έυκολο και προφανές είναι οι καταχωρητές. Υπάρχουν 32 καταχωρητές. Το πλήθος τους μπορεί να αναπαρασταθεί από 5 bits (0 - 2^5-1 ή 0 - 31). Οπότε ο κατα- χωρητής $8 σε δυαδικό είναι ο 01000. Πάμε να δούμε ένα παράδειγμα: Β. Μετατρέψτε σε assembly του ΜIPS μηχανής (binary) τον παρακάτω κώδικα. (2/10) lw $9 12($8) add $8,$18, $8 sw $8,12($9) lw $9, 12($8) opcode rs($8) rs($9) imm(12) 100011 | 01000 | 01001 | 0000000000001100 Συνέχισέ το και στις επόμενες ασκήσεις και ξαναγράψε αν κάπου κολλήσεις. Έχω γράψει κι έναν MIPS assembler, για εκπαιδευτικούς σκοπούς για το αντίστοιχο μάθημα της σχολής, αλλά δεν έχει νόημα, ακόμη τουλάχιστον να στο δώσω, αν πρώτα δεν μπορείς να λύσεις τις ασκήσεις από μόνος/η σου. Όταν αποκτήσεις κάποια οικειότητα στο δίνω. 2
Επισκέπτης Δημοσ. 17 Μαΐου 2015 Δημοσ. 17 Μαΐου 2015 add $8,$18, $8opcode s($18) t($8) d($8)100000 | 10010 | 01001 | 0000000000001001 σωστά ? να συνεχίσω ?
gon1332 Δημοσ. 17 Μαΐου 2015 Δημοσ. 17 Μαΐου 2015 Όπως βλέπουμε και από το link που σου παρέθεσα, η add είναι τύπου R, οπότε πάμε με το template για R types, δηλαδή: opcode | rs | rt | rd | shamt | fun Διαφορετικά πως το καταλαβαίνουμε; Η add χρησιμοποιεί τρεις καταχωρητές και άρα ανήκει σε μία ομάδα εντολών η οποία χρησιμοποιεί τρεις καταχωρητές και αυτή είναι η R. Επίσης, οι εντολές τύπου R έχουν πάντα opcode 0, οπότε αυτό το 100000 είναι το fun. Δηλαδή οι εντολές τύπου R διαχωρίζονται με βάση το fun και μόνο. Οπότε: add $8, $18, $8 opcode s($18) t($8) d($8) shamt fun 000000 | 10010 | 01000 | 01000 | 00000 | 1000000 Ξέρεις πώς να μετατρέπεις από δεκαδικό σε δυαδικό και το αντίστροφο;
Επισκέπτης Δημοσ. 17 Μαΐου 2015 Δημοσ. 17 Μαΐου 2015 Οχι απο Site: εδω το ειδα .. sw $8, 12($9) opcode rs($9) rs($8) imm(12) 101011 | 01001 | 01000 | 0000000000001100 αυτο πρεπει να το εχω κανει σωστο ..
Επισκέπτης Δημοσ. 17 Μαΐου 2015 Δημοσ. 17 Μαΐου 2015 lw $9, mat($8) slti $11, $9, 100 beq $11, $0, end sub $9, $9, $12 addi $8, $8, 4 end: lw $9, mat($8) opcode rs($8) rs($9) imm(mat (100)) 100011 | 01000 | 01001 | 00000000001100100 sub $9, $9, $12 opcode s($9) t($12) d($9) shamt fun 100010 | 01001 | 01100 | 01001 | 00000 | 1000000 addi $8, $8, 4 opcode s($8) t($8) imm(4) 001000 | 01000 | 01000 | 0000000100 Τα αλλα 2 ?
gon1332 Δημοσ. 18 Μαΐου 2015 Δημοσ. 18 Μαΐου 2015 (επεξεργασμένο) Τα slti και beq είναι τύπου I. Οπότε παρόμοια με addi. Δες και το link που σου έδωσα. Για την κωδικοποίηση του beq δες εδώ πώς υπολογίζεται το offset μεταπήδησης. Να σου κάνω μία ερώτηση; Γιατί θες να μάθεις από μόνος/η σου Assembly MIPS; Μήπως επειδή δεν πρόσεχες στο μάθημα; Επεξ/σία 18 Μαΐου 2015 από gon1332
Επισκέπτης Δημοσ. 18 Μαΐου 2015 Δημοσ. 18 Μαΐου 2015 Αν μπορεί ας τα ελέγξει κάποιος !! Γράψτε κώδικα σε assembly mips που να κάνει τις παρακάτω πράξεις. i. w = x+y+z ii. w = x-y+7 i. add $8, $16, $17 # tmp <- x + y add $8, $8, $18 # tmp <- tmp + z add $19, $8, $0 # w <- tmp + 0ii. sub $8, $16, $17 # tmp <- x - y addi $8, $8, 7 # tmp <- tmp + 7 add $18, $8, $0 # w <- tmp + 0 Μετατρέψτε σε assembly του ΜIPS μηχανής (binary) τον παρακάτω κώδικα. lw $9 12($8) add $8,$18, $8 sw $8,12($9) lw $9, 12($8) opcode rs($8) rs($9) imm(12) 100011 | 01000 | 01001 | 0000000000001100 add $8, $18, $8 opcode s($18) t($8) d($8) shamt fun 000000 | 10010 | 01000 | 01000 | 00000 | 100000 sw $8, 12($9) opcode rs($9) rs($8) imm(12) 101011 | 01001 | 01000 | 0000000000001100 Κώδικας: 10001101000010010000000000001100 00000010010010000100000000100000 10101101001010000000000000001100 Μετατρέψτε σε assembly του ΜIPS μηχανής (binary) τον παρακάτω κώδικα. To ‘mat’ είναι στην θέση μνήμης 100 (3/10) lw $9, mat($8) slti $11, $9, 100 beq $11, $0, end sub $9, $9, $12 addi $8, $8, 4 end: lw $9, mat($8) opcode rs($8) rs($9) imm(mat (100)) 100011 | 01000 | 01001 | 0000000001100100 slti $11, $9, 100 opcode s($11) t($9) imm(100) 001010 | 01011 | 01001 | 0000000001100100 beq $11, $0, end opcode s($11) t($0) endif (end (2) ) 001010 | 01011 | 00000 | 0000000000000010 sub $9, $9, $12 opcode s($9) t($12) d($9) shamt fun 100010 | 01001 | 01100 | 01001 | 00000 | 100000 addi $8, $8, 4 opcode s($8) t($8) imm(4) 001000 | 01000 | 01000 | 0000000000000100 Κώδικας: 10001101000010010000000001100100 00101001011010010000000001100100 00101001011000000000000000000010 10001001001011000100100000100000 00100001000010000000000000000100 Όχι, το έχω τον επόμενο χρόνο αλλά επειδή πήγα με ένα φίλο για παρέα , μου άρεσε και είπα να ασχοληθώ λίγο
gon1332 Δημοσ. 18 Μαΐου 2015 Δημοσ. 18 Μαΐου 2015 Τα δυο πρώτα είναι σίγουρα σωστά. Η τρίτη άσκηση με μία γρήγορη ματιά φαίνεται σωστή. Για πες, πώς υπολόγισες το immediate της beq; Έχει ενδιαφέρον να αναφερ- θεί στο παρόν θέμα. Ρωτάω επειδή μπορεί να το έβαλες στον simulator που χρησιμοποιείς και να το είδες, αλλά έχει αξία για το μάθημα να γνωρίζεις γιατί είναι έτσι.
Επισκέπτης Δημοσ. 18 Μαΐου 2015 Δημοσ. 18 Μαΐου 2015 Μέτρησα πόσες εντολές προσπερνάει μέχρι να φτάσει στο label end . Δηλαδή : lw $9, mat($8) slti $11, $9, 100 beq $11, $0, end sub $9, $9, $12 1 addi $8, $8, 4 2 end: Δες αν είναι σίγουρα ώστε να πάω στην τελευταια
gon1332 Δημοσ. 18 Μαΐου 2015 Δημοσ. 18 Μαΐου 2015 Παρατηρήσεις: To opcode της beq είναι 000100. H sub είναι R-format, οπότε έχει opcode 0 και fun αυτό που θα βρεις στο reference. Τα υπόλοιπα μου φαίνονται σωστά. Ίσως ξέφυγε κάτι, αν και δεν το νομίζω. Υπόψιν πως προφανώς και δεν κάνθησα να δω τον τελικό κώδικα που παραθέτεις στο τέλος κάθε άσκησης, αλλά μόνο τα στάδια. Μέτρησα πόσες εντολές προσπερνάει μέχρι να φτάσει στο label end . Δηλαδή : lw $9, mat($8) slti $11, $9, 100 beq $11, $0, end sub $9, $9, $12 1 addi $8, $8, 4 2 end: Δες αν είναι σίγουρα ώστε να πάω στην τελευταια Χοντρικά αυτό ισχύει. Δεν είναι όμως τυχαία έτσι. Υπάρχει λόγος που ισχύει αυτό και αν βρω χρόνο θα τον παραθέσω.
Επισκέπτης Δημοσ. 18 Μαΐου 2015 Δημοσ. 18 Μαΐου 2015 ΤΟ sub πως θα γίνει?? Οσο για τον κώδικα τον έκανα copy paste απο τα πάνω.. δεν προσθεσα κάτι.. πρέπει?
gon1332 Δημοσ. 18 Μαΐου 2015 Δημοσ. 18 Μαΐου 2015 ΤΟ sub πως θα γίνει?? Οσο για τον κώδικα τον έκανα copy paste απο τα πάνω.. δεν προσθεσα κάτι.. πρέπει? Το sub θα γίνει όπως το add. Όλες οι R-format έχουν opcode 000000. Το fun είναι αυτό που αλλάζει και τις κάνει να διαχωρίζονται. Για παράδειγμα το fun της sub είναι το 100010. Σωστά, δεν αλλάζει κάτι. Γι' αυτό και δεν τον κοίταξα.
Επισκέπτης Δημοσ. 19 Μαΐου 2015 Δημοσ. 19 Μαΐου 2015 Πόσες εντολές εκτελεί ο επεξεργαστής όταν τρέχει τον παρακάτω κώδικα; Αν όλες οι εντολές κοστίζουν 4 κύκλους ρολογιού, εκτός της LW που κοστίζει 5, πόσο χρόνο κάνει ο επεξεργαστής, αν λειτουργεί στα 100MHz; main: addi $8, $0, 12 addi $9, $0, 0 addi $10, $0, 0 loop1: la $11, mat lw $12, 0($11) addi $9, $9, 9 beq $8, $9, L1 addi $10, $10, 3 beq $8, $10, L2 j loop1 L1: addi $13, $0, 1 j end L2: addi $13, $0, 2 end: Σε αυτη δεν έχω ιδέα για το τι πρέπει να κάνω ..
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα