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

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

Δημοσ.

Να εκτελέσεις στο χαρτί τον κώδικα που σου δίνεται και να μετρήσεις πόσους κύκλους μηχανής ξοδεύει.

 

Hint: Επειδή όλες οι εντολές κοστίζουν 4 κύκλους μηχανής, εκτός από τις lw, απλά κατά την εκτέλεση του

κώδικα κράτα το πλήθος εκτέλεσης των lw.

 

Για παράδειγμα έστω ότι έχουμε τον παρακάτω κώδικα:

add $8, $18, $8
sub $8, $8, $9
lw  $9, 12($8)

Ο επεξεργαστής εκτελεί 3 εντολές. Η μία είναι lw, ενώ οι άλλες όχι.

Άρα συνολικά το πρόγραμμα "τρώει" 2*4 + 1*5 = 13 κύκλους μηχανής.

 

Στη συνέχεια με το δεδομένο που σου δίνει μπορείς να βρεις πόση

ώρα τρέχει το πρόγραμμα σε seconds.

 

f = 100MHz => 1/T = 100MHz => T = 1/100MHz = 1/100 ns = 10^-2 ns ο ένας κύκλος.

Άρα το πρόγραμμα εκτελείται για 13*10^-2 ns.

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

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

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

Ωραία , ευχαριστώ θα την δω και θα γραψω το αποτέλεσμα για να μου πεις !

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

Δηλαδη εδω πως γίνεται ? 

 

main:
addi  $8, $0, 12 (1)
addi $9, $0, 0 (2)
addi $10, $0, 0 (3)
loop1:
la $11, mat (4)
lw $12, 0($11) (5)
addi $9, $9, 9 (6)
beq $8, $9, L1 (7)
addi $10, $10, 3 (8)
beq $8, $10, L2 (9)
j loop1
L1:
addi $13, $0, 1
j end
L2:
addi $13, $0, 2
end:
 
με το beq ?
Δημοσ.

Κάποιες εντολές δίνουν τη δυνατότητα άλματος σε κάποια άλλη εντολή. Λογικά προγραμματισμό

έχεις κάνει στο πρώτο έτος. Καταλαβαίνεις έτσι, που μπορεί να χρειάζονται τέτοιες εντολές. Τέτοιες

εντολές MIPS είναι οι beq, bne, j, jal, jr και άλλες. Οι δύο πρώτες είναι εντολές άλματος υπό συνθήκη.

Δηλαδή θα εκτελεστεί το άλμα μόνο αν ισχύει η συνθήκη, διαφορετικά θα εκτελεστεί η αμέσως επόμε-

νη εντολή. Οι τρεις τελευταίες είναι εντολές άλματος χωρίς συνθήκη. Δηλαδή το άλμα θα εκτελεστεί

χωρίς να ελεχθεί κάποια συνθήκη.

 

Πάμε να δούμε ένα μικρό παράδειγμα:

# reg $s0 contains the integer 10

    add $s1, $0, $0
    add $t0, $0, $0
loop:
    bge  $t0, $s0, end:
    add  $s1, $s1, $t0
    addi $t0, $t0, 1
    j    loop
end:

Στον παραπάνω κώδικα ο $t0 αρχικά είναι 0, ενώ  ο $s0 είναι 10.

 

Με το που φτάνει ο PC στο bge, ελέγχεται αν η τιμή του $t0 ξεπέρασε αυτή του $s0. Αυτό δεν

ισχύει, οπότε προχωράμε με την αμέσως επόμενη εντολή. Αυτή η εντολή, προσθέτει την τιμή

του $t0 στην $s1. Τέλος αυξάνουμε την τιμή του $t0 κατά ένα και στη συνέχεια πραγματοποι-

είται άλμα στο label loop, οπότε και συνεχίζεται η εκτέλεση; Μέχρι πότε; Μέχρι η τιμή του $t0

να γίνει ίση ή να ξεπεράσει την τιμή του $s0. Και κάπως έτσι υλοποιείται ένα for loop statement

σε assembly MIPS.

 

Στη συγκεκριμένη περίπτωση το loop θα εκτελεστεί 10 φορές. Στην 11τη το $t0 θα είναι ίσο με

το 10, οπότε η συνθήκη της bge θα είναι αληθής, οπότε και ο PC θα "δείχνει" στο label end.

 

Άρα μέσα στο loop εκτελούνται συνολικά 10*3+1 εντολές. Το +1 για την τελευταία εκτέλεση της

bge. Οπότε κάπως έτσι θα δουλέψεις.

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

addi  $8, $0, 12 1

addi $9, $0, 0 1

addi $10, $0, 0 1

loop1:

la $11, mat 1111

lw $12, 0($11) 1111

addi $9, $9, 9 1111

beq $8, $9, L1 1111

addi $10, $10, 3 1111

beq $8, $10, L2 1111

j loop1 111

L1:

addi $13, $0, 1

j end

L2:

addi $13, $0, 2 1

end:

 

συνολο εντωλων που εκτελουνται : 31

οποτε 27*4+4*5 = 128

 

100Mhz=100000000Hz

 

οποτε 128/100000000 = 0,00000128s

 

(τους άσσους τους χρησημοποιω σαν μετρητες )  

Δημοσ.

Πως κατάφερες να μεταβείς στο label L1; Ο $8 αρχικοποιείται μία φορά και δεν αλλάζει σε 12.

Ο $8 συγκρίνεται μόνο με τον $9 για άλμα στην L1, αλλά ο $9 αρχικοποιείται με 0 και αυξάνεται

ανά 9άδες(0, 9, 18,...), άρα ποτέ δε συναντά το 12 και άρα ποτέ δεν πραγματοποιείται άλμα εκεί.

 

Εγώ έβγαλα αυτό:

main:
	addi  $8,  $0, 12     # 1
	addi  $9,  $0, 0      # 1
	addi  $10, $0, 0      # 1
loop1:
	la    $11, mat        # 1+1+1+1
	lw    $12, 0($11)     # 1+1+1+1
	addi  $9,  $9,  9     # 1+1+1+1
	beq   $8,  $9,  L1    # 1+1+1+1
	addi  $10, $10, 3     # 1+1+1+1
	beq   $8,  $10, L2    # 1+1+1+1
	j     loop1           # 1+1+1
L1:
	addi  $13, $0, 1      
	j     end             
L2:
	addi  $13, $0, 2      # 1
end:

## Τιμές
######################################
# $8  = 12
# $9  = 0, 9, 18, 27, 36
# $10 = 0, 3, 6, 9, 12
# $11 = &mat
# $12 = *mat

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα

  • Δημιουργία νέου...