无限数组循环 MIPS
Infinite array loop MIPS
所以我是 MIPS 的新手,我正在尝试在汇编 MIPS 中构建一个程序,它在数组中找到最大值:
.data
A: .word 11 100 3 5 8 13 1 16 #array of integers
N: .word 8 # array length
output_max: .asciiz "The max value is: "
.text
.globl main
main:
la $a0 N
la $a1 A
jal max
move $s0 $v0
li $v0 4
la $a0 output_max
syscall
li $v0 1
move $a0 $s0
syscall
j exit
exit:
li $v0 10
syscall
max:
move $t0 $a0
move $t1 $a1
lw $v0 0($t1)
li $t2 0
j maxLoop
maxLoop:
addi $t2 $t2 1
beq $t2 $t0 maxEnd
addi $t1 $t1 4
lw $t3 0($t1)
slt $t4 $v0 $t3
beq $t4 1 changeMax
j maxLoop
changeMax:
move $v0 $t3
j maxLoop
maxEnd:
jr $ra
max 函数应该return 输入数组中的最大值。所以编译之后,就进入了死循环。我不太明白问题出在哪里..
问题是您 运行 您的循环使用 N
的地址而不是 N
的值。 main
的第一行将 N
的地址加载到 $a0
中,它在您的 max
函数中变为 $t0
。但是,您随后在使用 beq $t2 $t0 maxEnd
.
的循环中将该地址用作 N
(即 8)的值
要么直接把值加载到$a0
开头:
main:
li $a0 8 # Length of A
或者首先取消引用 max
中的参数:
max:
lw $t0 0($a0) # Get value of N from pointer to N
所以我是 MIPS 的新手,我正在尝试在汇编 MIPS 中构建一个程序,它在数组中找到最大值:
.data
A: .word 11 100 3 5 8 13 1 16 #array of integers
N: .word 8 # array length
output_max: .asciiz "The max value is: "
.text
.globl main
main:
la $a0 N
la $a1 A
jal max
move $s0 $v0
li $v0 4
la $a0 output_max
syscall
li $v0 1
move $a0 $s0
syscall
j exit
exit:
li $v0 10
syscall
max:
move $t0 $a0
move $t1 $a1
lw $v0 0($t1)
li $t2 0
j maxLoop
maxLoop:
addi $t2 $t2 1
beq $t2 $t0 maxEnd
addi $t1 $t1 4
lw $t3 0($t1)
slt $t4 $v0 $t3
beq $t4 1 changeMax
j maxLoop
changeMax:
move $v0 $t3
j maxLoop
maxEnd:
jr $ra
max 函数应该return 输入数组中的最大值。所以编译之后,就进入了死循环。我不太明白问题出在哪里..
问题是您 运行 您的循环使用 N
的地址而不是 N
的值。 main
的第一行将 N
的地址加载到 $a0
中,它在您的 max
函数中变为 $t0
。但是,您随后在使用 beq $t2 $t0 maxEnd
.
N
(即 8)的值
要么直接把值加载到$a0
开头:
main:
li $a0 8 # Length of A
或者首先取消引用 max
中的参数:
max:
lw $t0 0($a0) # Get value of N from pointer to N