所以我有一个用于类的MIPS程序集的程序,我的意思是让用户创建一个给定大小的数组,然后输出最大的元素。但是,在尝试输出时,我无法访问除第一个数组元素之外的任何内容。我已经调试了几个小时了,我似乎无法找到问题。我的代码如下:
.
data
array: .space 40
size: .asciiz "Enter the size of the array (0 to 10): "
get: .asciiz "\nEnter an integer: "
error: .asciiz "\n!!!Invalid! Please input a size between 0 and 10: "
answer: .asciiz "\nThe largest element is: "
.text
main:
#get the size
li $t2, 10
li $v0, 4
la $a0, size
syscall
#get a size int, put in $t0
li $v0, 5
syscall
move $t0, $v0
slt $t3, $t2, $t0
#$t3 equals zero if they are not equal
slt $t3, $t2, $t0
getsize: beq $t3, $zero, store
li $v0, 4
la $a0, error
syscall
li $v0, 5
syscall
move $t0, $v0
slt $t3, $t2, $t0
j getsize
store:
#initialize a loop counter
li $t1, 0
#initialize a register with the address of array
la $s1, array
#loop method, with beq
initialize: beq $t1, $t0, read
#print the get integer message
li $v0, 4
la $a0, get
syscall
#get the input
li $v0, 5
syscall
move $t4, $v0
#move the input to register $t4
#sw $t4, 0($s1)
sw $t4, 0($s1)
addi $s1, $s1, 4
#store word in the array
#increment the loop's counter
addi $t1, $t1, 1
j initialize
read: #initialize array address
la $s0, array
#array counter
li $t1, 0
#largest found
lw $t2, 0($s0)
addi $s0, $s0, 4
find: beq $t1, $t0, printResult
#load the value of the array element
lw $t4, ($s0)
#increment the array
addi $s0, $s0, 4
#set less than to judge the current greatest against the new element
#1 if the new element is less than the old element
#0 if the new element is >= the old element
slt $t3, $t4, $t2
#if the new one is less than, we jump back to the top
bne $t3, $zero, find
#otherwise, we move make the new one the greatest and increment $t1
move $t4, $t2
addi $t1, $t1, 1
#jump to the top of the loop
j find
printResult:
li $v0, 4
la $a0, answer
syscall
li $v0, 1
move $a0, $t2
syscall
#end program
end:li $v0, 10
syscall
答案 0 :(得分:0)
您可以访问数组的所有元素,实际上是在数组末尾访问更多值,因此访问不是您真正的问题。
您的问题只是结果打印的第一个值而不是最大值。
之所以发生这种情况,是因为当您找到一个值时,您不会将较大的值存储在任何位置,因此您的t2
寄存器将保留第一个元素值,直到循环最终意外结束(由于错误{{ 1}}循环计数器逻辑),然后打印出第一个元素作为结果。
最大值更新只需要切换t1
的参数,但你应该重新设计循环计数器逻辑,并确保你没有达到数组后的元素(因为你跳过第一个数组元素,所以循环应该只在size-1元素上运行,或者你可以初始化t1 = 1来获得大小为1的迭代,一旦你修复了它的递增逻辑)。