kostasdi Δημοσ. 8 Ιανουαρίου 2016 Δημοσ. 8 Ιανουαρίου 2016 Για όσους δεν ξέρουν το WinMIps64 βγάζει ένα bug στην εντολή jal όταν θέλουμε να τρέξουμε ένα πρόγραμμα με enable το Forwarding και το Branch Target Buffer(ταυτόχρονα). Αντί να επιστρέφει την διεύθυνση μνήμης της επόμενης στη σειρά εντολής επιστρέφει τη διεύθυνση μνήμης της επόμενης προς εκτέλεση εντολής.Έχουμε λοιπόν αυτό το κομμάτι του προγράμματος factorial: slti r10,r1,2 bnez r10,out ; set r10=1 and return if r1=1 sd r31,(r29) daddi r29,r29,8 ; push return address onto stack sd r1,(r29) daddi r29,r29,8 ; push r1 on stack daddi r1,r1,-1 ; r1 = r1-1 jal factorial ; recurse... dadd r4,r0,r10 daddi r29,r29,-8 ld r3,(r29) ; pop n off the stack dmulu r3,r3,r4 ; multiply r1 x factorial(r1-1) dadd r10,r0,r3 ; move product r3 to r10 daddi r29,r29,-8 ; pop return address ld r31,0(r29) out: jr r31 Η "jal factorial" αντί να επιστρέφει την διεύθυνση μνήμης της εντολής "dadd r4,r0,r10" επιστρέφει την διεύθυνση μνήμη της εντολής "slti r10,r1,2" και έτσι το πρόγραμμα μπαίνει σε έναν ατέρμων βρόχο. Σκέφτηκα δύο λύσεις γι΄αυτό : 1)Να αλλάξω την "jal" με την "j" αλλά δεν ξέρω πώς να αποθηκεύσω την διεύθυνση μνήμης της "dadd r4,r0,r10" προκειμένου να μπει στον καταχωρητή "r31" 2)Να βάλω την εντολή "dadd r4,r0,r10" πριν την εντολή "slti r10,r1,2" ώστε να είναι ουσιαστικά η πρώτη εκτελέσιμη εντολή μετά την jal.Αλλά δεν τρέχει. Έχει κανένας καμία ιδέα;; Αν κάποιος θέλει να δει όλο το πρόγραμμα ..είναι το πρόγραμμα factorial.s και είναι ένα από τα παραδείγματα-προγράμματα του WinMips64 Site: https://github.com/FMCalisto/ILP/blob/master/winmips64/factorial.s#L44
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα