Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Επισκέπτης
Δημοσ.

Γενικά.. τι πρέπει να κάνω?

  • Απαντ. 36
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.

Γενικά.. τι πρέπει να κάνω?

Ουπς, συγγνώμη. Λάθος μου, δε διάβασα καλά την εκφώνηση.

 

Λοιπόν. Υποθέτω γνωρίζεις πως οι εντολές 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, για εκπαιδευτικούς σκοπούς για το

αντίστοιχο μάθημα της σχολής, αλλά δεν έχει νόημα, ακόμη τουλάχιστον

να στο δώσω, αν πρώτα δεν μπορείς να λύσεις τις ασκήσεις από μόνος/η

σου. Όταν αποκτήσεις κάποια οικειότητα στο δίνω.

 

 

  • Like 2
Επισκέπτης
Δημοσ.

add $8,$18, $8
opcode s($18) t($8) d($8)
100000 | 10010 | 01001 | 0000000000001001

 

σωστά ? να συνεχίσω ?

Δημοσ.

Όπως βλέπουμε και από το 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

Ξέρεις πώς να μετατρέπεις από δεκαδικό σε δυαδικό και το αντίστροφο;

Επισκέπτης
Δημοσ.

Οχι απο Link.png Site: εδω  το ειδα .. 


sw  $8, 12($9)
    opcode   rs($9)  rs($8)      imm(12)
    101011 | 01001 | 01000 | 0000000000001100
 
αυτο πρεπει να το εχω κανει σωστο ..
Επισκέπτης
Δημοσ.

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 ?

Δημοσ. (επεξεργασμένο)

Τα slti και beq  είναι τύπου I. Οπότε παρόμοια με addi. Δες και το link που σου έδωσα.

 

Για την κωδικοποίηση του beq δες εδώ πώς υπολογίζεται το offset μεταπήδησης.

 

Να σου κάνω μία ερώτηση; Γιατί θες να μάθεις από μόνος/η σου Assembly MIPS;

 

Μήπως επειδή δεν πρόσεχες στο μάθημα;

 

Επεξ/σία από gon1332
Επισκέπτης
Δημοσ.

Αν μπορεί ας τα ελέγξει κάποιος !!

 

Γράψτε κώδικα σε 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 + 0

ii. 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


Όχι, το έχω τον επόμενο χρόνο αλλά επειδή πήγα με ένα φίλο για παρέα , μου άρεσε και είπα να ασχοληθώ λίγο

Δημοσ.

Τα δυο πρώτα είναι σίγουρα σωστά. Η τρίτη άσκηση με μία γρήγορη ματιά φαίνεται

σωστή. Για πες, πώς υπολόγισες το immediate της beq; Έχει ενδιαφέρον να αναφερ-

θεί στο παρόν θέμα.

 

Ρωτάω επειδή μπορεί να το έβαλες στον simulator που χρησιμοποιείς και να το είδες,

αλλά έχει αξία για το μάθημα να γνωρίζεις γιατί είναι έτσι.

Επισκέπτης
Δημοσ.

Μέτρησα πόσες εντολές προσπερνάει μέχρι να φτάσει στο 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:

 

Δες αν είναι σίγουρα ώστε να πάω στην τελευταια

Δημοσ.

Παρατηρήσεις:

  • 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:

 

Δες αν είναι σίγουρα ώστε να πάω στην τελευταια

Χοντρικά αυτό ισχύει. Δεν είναι όμως τυχαία έτσι. Υπάρχει λόγος που ισχύει αυτό

και αν βρω χρόνο θα τον παραθέσω.

Επισκέπτης
Δημοσ.

ΤΟ sub πως θα γίνει?? Οσο για τον κώδικα τον έκανα copy paste απο τα πάνω.. δεν προσθεσα κάτι.. πρέπει?

Δημοσ.

ΤΟ sub πως θα γίνει?? Οσο για τον κώδικα τον έκανα copy paste απο τα πάνω.. δεν προσθεσα κάτι.. πρέπει?

Το sub θα γίνει όπως το add.

Όλες οι R-format έχουν opcode 000000. Το fun είναι αυτό που αλλάζει και τις κάνει να διαχωρίζονται.

Για παράδειγμα το fun της sub είναι το 100010.

 

Σωστά, δεν αλλάζει κάτι. Γι' αυτό και δεν τον κοίταξα.

Επισκέπτης
Δημοσ.

Πόσες εντολές εκτελεί ο επεξεργαστής όταν τρέχει τον παρακάτω κώδικα; Αν όλες οι εντολές κοστίζουν 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:

 

Σε αυτη δεν έχω ιδέα για το τι πρέπει να κάνω ..

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...