Domanda

I am making a program for a user to input a range of numbers, and calculate the min, max and median. Right now, I am only trying to collect the numbers and echo them back to make sure I am getting them. Here is the problem:

I input numbers like this: 1 2 3 4 5

And when the array is printed out I get: 15345

It does not matter what numbers are used, the 2nd element in the array is always replace by the last element.

Here is my mips code, I know it is kind of long, but it is the shortest workable example I can make.

Note: you must enter 9999 for the program to exit the loop.

.data 
welcomeString:  .asciiz "Please input one number at a time, and then press enter.\n"
intArray: .word 4000
size: .word 0

.text
main:
li $v0, 4
la $a0, welcomeString
syscall
la $a0, intArray
jal gather_numbers
la $a0, intArray
jal print_array

####################################################################################

gather_numbers:
addi $sp, $sp, -12
sw $a0, 0($sp)
sw $s0, 4($sp)
sw $s1, 8($sp)
sw $t1, 12($sp)

move $s0, $a0 #the address of the array
lw $s1, size # load the size
li $t1, 0 # so it enters the loop

start_gather_numbers: beq $t1, 9999, exit_gather_numbers
              li $v0, 5 # read the integer
              syscall
              sw $v0, 0($s0)
              move $t1, $v0 # put the value into t1 to be tested
              addi $s0, $s0, 4 #increment the address
              addi $s1, $s1, 1 # increment the size
              j start_gather_numbers
exit_gather_numbers:  addi $s1, $s1, -1 # fix the size
                  sw $s1, size # store the size
              lw $a0, 0($sp) # pop the stack
              lw $s0, 4($sp)
              lw $s1, 8($sp)
              lw $t1, 12($sp)
              addi $sp, $sp, 12

####################################################################################

####################################################################################

print_array:
addi $sp, $sp, -16
sw $a0, 0($sp)
sw $s0, 4($sp)
sw $s1, 8($sp)
sw $t0, 12($sp)
sw $t1, 16($sp)

move $s0, $a0 # the address of the array
lw $s1, size # load the size of the array
li $t0, 0 # i = 0

start_print_array: bge $t0, $s1, exit_print_array
                   lw $t1, 0($s0) # load the int to print
                   li $v0, 1 # print the integer
           move $a0, $t1
           syscall
           addi $s0, $s0, 4
           addi $t0, $t0, 1
           j start_print_array
exit_print_array:  lw $a0, 0($sp)
           lw $s0, 4($sp)
           lw $s1, 8($sp)
           lw $t0, 12($sp)
           lw $t1, 16($sp)
           addi $sp, $sp, 16
È stato utile?

Soluzione

There are a few things going wrong here.

Firstly all of your functions are missing the terminating jr $ra.

Also, your stack manipulation is wrong. You are consistently allocating 4 less bytes than you use. If you want to put 5 words on the stack you should expand the stack by 20 not 16.

Most importantly though here is your intArray directive. You have used .word 4000 I'm guessing to allocate an array of ints, but rather you have allocated space for 1 word with the value 4000.

To instead allocate an array of 1000 ints you could use .space 4000 or equally .word 0:1000.

When I made these changes your program began to function as desired.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top