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

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

Δημοσ.

Καλησπέρα.Μιας και ξεκίνησε το διάβασμα για εξεταστική,αποφάσισα να ασχοληθώ λιγάκι με τις εντολές σε 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
Δημοσ.

Θα μπορούσες να το κάνεις αυτό που έκανες με το 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 

 

 

 

Για όποιες απορίες, εδώ είμαστε. :)

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

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

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

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

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

Σύνδεση

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

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