в MIPS, как я могу отобразить результаты методов в основном? - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть это домашнее задание, чтобы прочитать массив от пользователя, затем найти среднее значение и найти определенный c номер, введенный пользователем. Я не могу напечатать значение avg и вывод findNumber дает мне тот же результат и хочу прочитать возвращаемые значения методов AveArray () и FindNum () и отобразить результаты в главном. Можете ли вы помочь мне, пожалуйста, вот мой код:

.data 
arr_size : .asciiz "Please enter number of elements (N) :  " ;
array : .asciiz "Please enter number of the array :  \n" ;
options : .asciiz "                          **** Options**** \n " ;
Compute: .asciiz "  1- To compute the average of the array elements .\n  " ;
Search : .asciiz " 2- Search for a number in the array.\n " ;
choice : .asciiz "Enter your choice:   "  ;
average : .asciiz "The average is  :    " ;
value : .asciiz "\nEnter the value to be searched :  " ;
found : .asciiz "Number is found " ;
notFound : .asciiz "Nmber is not found  " ;
arr: .word 40
#---------------------------------------------------------------------------------
.text
main:
li $t0, 0                      #sets index to 0
li $t1, 0                      #sets input num to 0
li $t2, 0                      # sets count to 0
li $s0, 0                      #sets sum to 0
li $t7, 1                      #sets choice to 1

# display the arraySize message
la $a0,arr_size      
li $v0,4                    
syscall        

#user input number of elements
li $v0,5                    
syscall
move $t3,$v0 

# display the numberOfArray message
la $a0,array           
li $v0,4                   
syscall                      
jal rearArray

# display the Options message
la $a0,options        
li $v0,4                    
syscall   

# display the firstChoice message
la $a0,Compute   
li $v0,4                    
syscall       

# display secondChoice message
la $a0,Search      
li $v0,4                   
syscall                    

# display userChoice message
la $a0,choice    
li $v0,4                   
syscall  
li $v0,5                    
syscall
move $t6,$v0 
beq $t6, $t7, aveArray
jal FindNum                 

#------------------------------------------------------------------------
rearArray:
beq $t2, $t3, end        #if  count > size of array stop
li $v0, 5
syscall
move $t1,$v0              # sets input to num
sb $t1, arr($t0)            #stores integer in array
addi $t0, $t0, 4            #increments index by 4
addi $t2, $t2, 1            #increments count
j rearArray 
end : jr $ra

#----------------------------------------------------
aveArray :
beq $t2, $t3,avg          #exits loop when everything is read
lw $t1, arr($t0)
add $s0, $s0, $t1        #calculates sum
addi $t0, $t0, 4            #increments index by 4
addi $t2, $t2, 1            #increments count
j aveArray 
avg :
div $s1, $s0, $t3        #calculates average
la $a0,average      
li $v0,4                    
syscall 

li $v0,4
move $a0
 # end of program
li $v0,10
syscall
#------------------------------------------------------------
FindNum :
la $a0,value           
li $v0,4                   
syscall
li $v0,5                    
syscall
move $t8,$v0                 #search for a specific number 

beq $t2, $t3,end1         #exits loop when everything is read
lw $t1, arr($t0)
beq $t8,$t1,end2
addi $t0, $t0, 4            #increments index by 4
addi $t2, $t2, 1            #increments count
j FindNum

end2:
la $a0,found           
li $v0,4                   
syscall 
jr $ra

end1 :
la $a0,notFound           
li $v0,4                   
syscall 
 jr $ra

1 Ответ

1 голос
/ 18 апреля 2020
  1. Когда вы отлаживали свой поток управления, вы заметили, что ваш main не заканчивается должным образом? (Может быть, он перестал работать раньше, чем закончился?) Но, без кода завершения sh после вызова jal FindNum, он просто столкнулся бы с другой функцией, которая плохая .

  2. Вы используете sb, для хранения байтов, для хранения «слов». Если пользователь вводит числа, превышающие 255, вы найдете странные (усеченные) результаты (или просто странные результаты - в зависимости от того, используете ли вы big-endian или little-endian).

  3. Ваш массив слов содержит всего 1 слово (инициализируется значением 40). как будто в C: int array = 40;.

  4. Предлагаем объявить массив следующим образом:

           .align 2
    array: .space 40
    

Старайтесь не вкладывать код для одной функции внутри другой функции. Храните код каждой функции вместе с самим собой и отдельно от других, чтобы избежать ошибок логики потока управления c ошибок.

...