Assembly 我想找到数组向量的最大值,什么';我的代码(程序集mips)有什么问题?
我知道你的代码有什么问题。出于某种原因,第39行:Assembly 我想找到数组向量的最大值,什么';我的代码(程序集mips)有什么问题?,assembly,mips,Assembly,Mips,我知道你的代码有什么问题。出于某种原因,第39行: .data Vector: .space 24 promptInt: .asciiz "Please input an integer: " linefeed: .asciiz "\n" enterkey: .asciiz"Press any key to end program." .text main: li $t0,0 li $t1,0 for: bge $t0,6,end_for #loop li $v0,4 la $a0,p
.data
Vector: .space 24
promptInt: .asciiz "Please input an integer: "
linefeed: .asciiz "\n"
enterkey: .asciiz"Press any key to end program."
.text
main:
li $t0,0
li $t1,0
for:
bge $t0,6,end_for #loop
li $v0,4
la $a0,promptInt
syscall #print "Please input an integer: "
li $v0,5
syscall #read integer
sw $v0,Vector($t1) #move integer to array Vector
mul $t1,$t0,4
addi $t0,$t0,1
j for
end_for: #end of loop
li $t0,0 #i
li $t1,0 #array position
li $t2,0 #max
li $t3,0 #temp
for2:
bge $t0,6,end_for2 #second loop
lw $t3,Vector($t1)
blt $t3,$t2,if
move $t2,$t3
if:
mul $t1,$t0,4
addi $t0,$t0,1
j for2
end_for2:
li $v0,1
move $a0,$t2
syscall #print sum
li $v0,4
la $a0,linefeed
syscall # print linefeed
li $v0,4
la $a0,enterkey
syscall #print "Press any key to end program."
li $v0,5
syscall #read enter
li $v0,10
syscall #exit
当t1为0时,从数组返回第二个而不是第一个元素。为什么我不知道,因为我从未使用过固定大小的数组。我知道背后的逻辑,但我从来没有用过
我总是使用动态分配数组,使用系统调用9(sbrk)进行动态分配
试试这个:
lw $t3,Vector($t1)
您应该告诉我们您的代码出了什么问题,至少在任何错误消息或意外输出方面。在调试器/模拟器中单步执行,也许您可以找到自己的错误。此外,如果您希望他人帮助您,请更好地注释您的代码。
.text
LoadArray:
# ------------
# arguments:
# a0 = array length
# ------------
move $t0, $a0 #save array length
mulo $a0, $a0, 4 #for n int elements we need 4 * n memory size
li $v0, 9 #system call for dynamic allocation
syscall #make the call
move $t1, $v0 #save array address
li $t2, 0 #i = 0
loadarray_loop:
bge $t2, $t0, loadarray_exit #when i >= n exit loop
mulo $t3, $t2, 4 #calculate offset [index * 4]
add $t4, $t3, $t1 #add offset on array address
la $a0, promptInt #write the message
li $v0, 4
syscall
li $v0, 5 #system call for read int
syscall #make the call
sw $v0, 0($t4) #insert element into array
addi $t2, $t2, 1 #i++
j loadarray_loop
loadarray_exit:
move $v0, $t1 #prepare return value
jr $ra #return
PrintArray:
# ------------
# arguments:
# a0 = array length
# a1 = array address
# ------------
move $t0, $a0
li $t1, 0
printarray_loop:
bge $t1, $t0, printarray_exit
mulo $t2, $t1, 4 #calculate offset [index * 4]
add $t3, $t2, $a1 #add offset on array address
lw $a0, 0($t3) #get element from array
li $v0, 1 #system call for print int
syscall #make the call
li $a0, 32 #ascii for space
li $v0, 11 #system call for print char
syscall #make the call
addi $t1, $t1, 1 #i++
j printarray_loop
printarray_exit:
li $a0, 10 #ascii for line feed
li $v0, 11 #system call for print char
syscall #make the call
li $a0, 13 #ascii for cariage return
li $v0, 11 #system call for print char
syscall #make the call
jr $ra
ArrayMax:
# ------------
# arguments:
# a0 = array length
# a1 = array address
# ------------
li $t0, 1 #set counter to 1
lw $t1, 0($a1) #on the beginning the max is the first element from array
arraymax_loop:
bge $t0, $a0, arraymax_exit
mulo $t2, $t0, 4 #calculate offset [index * 4]
add $t3, $t2, $a1 #add offset on array address
lw $t4, 0($t3) #get element from array
ble $t4, $t1, arraymax_continue
move $t1, $t4 #set new max
arraymax_continue:
addi $t0, $t0, 1 #i++
j arraymax_loop
arraymax_exit:
move $v0, $t1 #prepare result
jr $ra
main:
#entry point
li $v0, 5 #ask user to insert array length
syscall
move $s0, $v0 #save n
move $a0, $v0
jal LoadArray
move $s1, $v0 #save array address
move $a0, $s0 #print array
move $a1, $s1
jal PrintArray
move $a0, $s0 #obtain max
move $a1, $s1
jal ArrayMax
move $a0, $v0 #print max element
li $v0, 1
syscall
li $v0, 10
syscall #make the call
.data
promptInt: .asciiz "Please input an integer: "