Vkt678 Δημοσ. 2 Ιουνίου 2015 Δημοσ. 2 Ιουνίου 2015 Καλησπέρα.Μιας και ξεκίνησε το διάβασμα για εξεταστική,αποφάσισα να ασχοληθώ λιγάκι με τις εντολές σε assembly.Ένα από τα ενδεικτικά προβλήματα είναι το ακόλουθο : Γράψτε πρόγραµµα assembly MIPS που να υπολογίζει τον µικρότερο ακέραιο αριθµό που περιέχεται σε έναν πίνακα 10 ακεραίων. Ο πίνακας ακεραίων πρέπει να ορίζεται στο τµήµα .data του προγράµµατός σας. Το αποτέλεσµα να εκτυπώνεται στην κονσόλα. Μπορείτε να χρησιµοποιήσετε ψευδοεντολές. Παραθέτω τον κώδικα από κάτω και θα ήθελα να μου πείτε αν είναι σωστή η σκέψη. (Δεν έχει συντακτικά λάθη,το έχω ελέγξει με τον qtspim). Επίσης θα ήθελα να μου πείτε αν το label Set που κατασκεύασα θα ήταν σωστό να το έβαζα πριν από την εντολή jump ή δεν παίζει κανένα ρόλο. Ευχαριστώ εκ των προτέρων. [EDIT]:Διαβάζοντας καλύτερα την εκφώνηση,είδα ότι ζητείται ο μικρότερος αριθμός οπότε αντί για την εντολή bgt θα χρησιμοποιήσω την blt. .data myArray: .space 40 .text .globl __start __start: move $t0,$zero lw $t1,myArray($t0) while: beq $t0,40,exit addi $t0,$t0,4 lw $t2,myArray($t0) bgt $t2,$t1,Set j while Set: lw $t1,myArray($t0) exit: li $v0,1 move $a0,$t1 syscall li $v0,10 syscall
gon1332 Δημοσ. 4 Ιουνίου 2015 Δημοσ. 4 Ιουνίου 2015 Θα μπορούσες να το κάνεις αυτό που έκανες με το Set, αρκεί να έβαζες μία αύξηση του counter και ένα jump στο while παραπάνω. Διαφορετικά μπορείς να τα κρατήσεις μέσα στο βασικό loop. Επειδή δεν έχω πολύ χρόνο μπροστά μου, ορίστε κώδικας εύρεσης min/max από το site του αντίστοιχου μαθήματος της σχολής του Βόλου: ## ## ## Implemention of the "min/max" function ## in MIPS assembly ## ## ################################################# # data segment # ################################################# .data # statically defined input strings msg1: .asciiz "Please give the size of the vector >0 : " min_msg: .asciiz "MIN = " max_msg: .asciiz "MAX = " newline: .asciiz "\n" .align 2 array: .space 400 ################################################# # text segment # ################################################# .text .globl main # label "main" must be global main: li $v0, 4 # Message to enter a number la $a0, msg1 syscall #### # Read size N of array #### again: li $v0,5 # Loop until n>0 syscall blez $v0, again move $t0, $v0 # $t0 = N li $t1, 0 li $t2, 0 #### # Read N numbers #### read_loop: li $v0,5 # Read n numbers syscall # and store them in array sw $v0, array($t2) addi $t2, $t2, 4 addi $t1, $t1, 1 blt $t1, $t0, read_loop #### # Main part of the code #### li $t1, 0 li $s0, 0x80000000 # smallest integer (will contain the max) li $s1, 0x7FFFFFFF # largest integer (will contain the min) loop: bge $t1, $t0, print # main loop for min/max sll $t2, $t1, 2 lw $t2, array($t2) ble $t2, $s0, L1 move $s0, $t2 L1: bge $t2, $s1, L2 move $s1, $t2 L2: addi $t1, $t1, 1 j loop #### # Print min and max to the console #### print: # Finally, print min/max li $v0, 4 # First, min la $a0, min_msg syscall move $a0, $s1 li $v0, 1 syscall li $v0, 4 la $a0, newline syscall li $v0, 4 # Then, max la $a0, max_msg syscall move $a0, $s0 li $v0, 1 syscall li $v0, 4 la $a0, newline syscall #### # and Exit #### Exit: li $v0,10 # and done! syscall Για όποιες απορίες, εδώ είμαστε.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα