THMMY.gr

Μαθήματα Βασικού Κύκλου => Οργάνωση Υπολογιστών => Topic started by: Wibvious on April 10, 2019, 20:24:53 pm



Title: [Οργάνωση Υπολογιστών] quiz 3b
Post by: Wibvious on April 10, 2019, 20:24:53 pm
Hello everyone!

Εχει κανεις ιδεα τι παει στραβα με τον κωδικα μου για το quiz 3b? Κανει compile και δουλευει μονο για την περιπτωση οπου ο πινακας εχει μεγεθος 0. Χρησιμοποιω κατευθειαν τους καταχωρητες που εχουν τα ορισματα και δεν κανω κατι load η store (γενικα δεν χρησιμοποιω μνημη).

Η εκφωνηση:

 
Quote
Στόχος της παρούσας εργασίας είναι να υλοποιηθεί συνάρτηση, σε MIPS Assembly, η οποία έχοντας ως είσοδο τον δείκτη (pointer -- θέση μνήμης) ενός διανύσματος και το μήκος του, θα βρίσκει την τιμή του μέγιστου στοιχείου και την θέση του στο διάνυσμα. Στην περίπτωση όπου το μέγιστο στοιχείο επαναλαμβάνεται, θα επιστρέφει την θέση της τελευταίας εμφάνισής του. Η αρίθμηση ξεκινάει από το 1 (1-based indexing). Στην περίπτωση όπου το διάνυσμα είναι κενό (μήκος μηδέν) θα επιστρέφεται ο μικρότερος προσημασμένος ακέραιος και η τιμή 0 στην θέση.

Ο κωδικας:

Code:
MaxAndArg:
        li $v0, -2147483648         # $v0(MAX) is the smallest negative number
        li $v1, 0                           # $v1(POSITION) starts from zero
        li $t3, 0                           # $t3(i in a normal language) will be used to loop
        li $t4, 0                           # $t4 will be used to show the position in the array
  
L2:        
            beq $t3, $a1, EXIT        # if (i = array size) goto EXIT
 
            sll $t4, $t4, 2                # $t4 = $t4 * 4
            add $a0, $t4, $a0         # $a0 = $a0 + $t4 (next element in the array)

            blt $v0, $a0, L1             # if (max < a[j]) goto L1

            addi $t3, $t3, 1             # i++
            addi $t4, $t4, 1             # array_position++

            j L2

L1:
        addi $v0, $a0, 0          # $v0 = $a0  
        addi $v1, $t3, 1           # $v1 = i + 1 (probably works)
        addi $t3, $t3, 1           # i++
        addi $t4, $t4, 1           # array_position++

            j L2

EXIT:      
         jr     $ra                      #return


Ευχαριστω προκαταβολικα    :)

edit: tag


Title: Re: quiz 3b
Post by: mpraskafoutas on April 10, 2019, 20:48:57 pm
οταν ο compiler θα περάσει στο label L1, θα γίνει $t3 = $t3+1 και $t4 = $t4+1 και στο j L2 θα συνεχίσει από εκεί που σταμάτησε, άρα θα ξαναπροσθέσει 1 στους καταχωρητές $t3 και $t4.

επίσης εγώ έκανα και lw $a0, array_z($t4), όπου ο $t4 είναι στην περίπτωση σου ο καταχωρητής που χρησιμοποιείς για να προσπελάσεις τα στοιχεία του πίνακα. αυτό το έκανα επειδή θεώρησα ότι ο $a0 περιέχει τη διεύθυνση του πίνακα, μπορείς να τσεκάρεις αν χρειάζεται και αυτό (δεν θα προκαλέσει πρόβλημα στον κώδικα ούτως ή άλλως).


Title: Re: quiz 3b
Post by: Aristos on April 10, 2019, 20:50:54 pm
δε πολυθυμάμαι mips assembly οπότε κράτα επιφυλάξεις για ότι ακολουθεί:

(γενικα δεν χρησιμοποιω μνημη)

αυτό είναι πρόβλημα. το διάνυσμα στη μνήμη δε βρίσκεται;

Code:
add $a0, $t4, $a0         # $a0 = $a0 + $t4 (next element in the array)
blt $v0, $a0, L1             # if (max < a[j]) goto L1

στο $a0 θα βρίσκεται η διεύθυνση του επόμενου στοιχείου. Συγκρίνεις διευθύνσεις με τιμές. Πρέπει να κάνεις load την τιμή και μετά σύγκριση.

επίσης, νομίζω πως ο τρόπος που υπολογίζεις το array_position είναι λάθος. κανε debug στον simulator και δες πως αυξάνεται. άμα θέλεις να υπολογίσεις θέση μνήμη για το array, θες διεύθυνση_του_array + 4 * i, όπου το i αυξάνει κατά 1 σε κάθε επανάληψη. εσύ το πολλαπλασιαζεις με 4 και μετά αυξάνεις το αποτέλεσμα και άλλο. υπολογίζεις δηλαδή λάθος διεύθυνση


Title: Re: quiz 3b
Post by: Wibvious on April 11, 2019, 10:23:30 am
οταν ο compiler θα περάσει στο label L1, θα γίνει $t3 = $t3+1 και $t4 = $t4+1 και στο j L2 θα συνεχίσει από εκεί που σταμάτησε, άρα θα ξαναπροσθέσει 1 στους καταχωρητές $t3 και $t4.


Καλή παρατήρηση...δεν είχα στο μυαλό μου ότι συνεχίζει από εκεί που σταμάτησε.


Quote
Επίσης εγώ έκανα και lw $a0, array_z($t4), όπου ο $t4 είναι στην περίπτωση σου ο καταχωρητής που χρησιμοποιείς για να προσπελάσεις τα στοιχεία του πίνακα. αυτό το έκανα επειδή θεώρησα ότι ο $a0 περιέχει τη διεύθυνση του πίνακα, μπορείς να τσεκάρεις αν χρειάζεται και αυτό (δεν θα προκαλέσει πρόβλημα στον κώδικα ούτως ή άλλως).

Δεν καταλαβαίνω τι προσπαθείς να κάνεις με αυτή την εντολή. Το lw δεν έχει σύνταξη lw destination, offset(source) ;

Ευχαριστώ πολύ για την βοήθεια πάντως   ;D


Title: Re: quiz 3b
Post by: Wibvious on April 11, 2019, 10:25:39 am
δε πολυθυμάμαι mips assembly οπότε κράτα επιφυλάξεις για ότι ακολουθεί:

αυτό είναι πρόβλημα. το διάνυσμα στη μνήμη δε βρίσκεται;

Code:
add $a0, $t4, $a0         # $a0 = $a0 + $t4 (next element in the array)
blt $v0, $a0, L1             # if (max < a[j]) goto L1

στο $a0 θα βρίσκεται η διεύθυνση του επόμενου στοιχείου. Συγκρίνεις διευθύνσεις με τιμές. Πρέπει να κάνεις load την τιμή και μετά σύγκριση.

επίσης, νομίζω πως ο τρόπος που υπολογίζεις το array_position είναι λάθος. κανε debug στον simulator και δες πως αυξάνεται. άμα θέλεις να υπολογίσεις θέση μνήμη για το array, θες διεύθυνση_του_array + 4 * i, όπου το i αυξάνει κατά 1 σε κάθε επανάληψη. εσύ το πολλαπλασιαζεις με 4 και μετά αυξάνεις το αποτέλεσμα και άλλο. υπολογίζεις δηλαδή λάθος διεύθυνση

Έχεις δίκιο, ευχαριστώ πολύ για την βοήθεια. :)


Title: Re: quiz 3b
Post by: mpraskafoutas on April 11, 2019, 12:20:01 pm

Δεν καταλαβαίνω τι προσπαθείς να κάνεις με αυτή την εντολή. Το lw δεν έχει σύνταξη lw destination, offset(source) ;

Ευχαριστώ πολύ για την βοήθεια πάντως   ;D


το destination θα είναι ένας καταχωρητής ο οποίος θα περιέχει το τρέχον στοιχείο του πίνακα σε κάθε επανάληψη. μετά offset μπορείς να βάλεις 0 και source θα είναι καταχωρητής ο οποίος θα περιέχει το άθροισμα της διεύθυνσης + τον δείκτη που χρησιμοποιείς * 4. είναι το ίδιο πράγμα με αυτό που αναφέρει το παλικάρι πιο πάνω.