嗨,我有这个程序,该程序应该从用户输入数字列表中找到总和,最小值和最大值。在我调用blt或bgt函数之前,它都可以正常工作 此时,qtspim将一堆寄存器变为红色。 经过错误测试,我发现这是因为更改了寄存器值,所以我增加了堆栈空间,但是它仍然做同样的事情,并且我一直在尝试所有事情,但没有任何效果。 抱歉,我是一个初学者,这是我的代码
.data
intro: .asciiz "Enter integer values, one perline, terminated by a negative value.\n"
total: .asciiz "\nSum: "
minn: .asciiz "\nMin: "
maxx: .asciiz "\nMax: "
mean: .asciiz "\nMean: "
.align 2
ARRAY: .space 400
.align 2
.text
.globl main
####################################
#$s1 = input counter
#$s2 = array address
#$t1 = min
#$t2 = max
#$s6 = sum
##########################################
main:
la $s2, ARRAY #array address
li $s6, 0 #sum
lui $t1, 0x7fff #min
ori $s3, $s3, 0xffff
li $t2, 0 #max
li $v0, 4 #ask user for numbers
la $a0, intro
syscall
LOOP:
li $v0, 5 #collect user input
syscall
move $s0, $v0
blt $s0, $zero, DONE
addiu $s1, $s1, 1 #add to counter
sw $s0, 0($s2) #store number in array
addiu $s2, $s2, 4 #get next array space
add $s6, $s6, $s0 #adding total sum
blt $s0, $t1, min
bgt $s0, $t2, max
j LOOP
DONE:
li $v0, 4 #show sum
la $a0, total
syscall
li $v0, 1
move $a0, $s6
syscall
li $v0, 4 #show min
la $a0, minn
syscall
li $v0, 1
move $a0, $t1
syscall
jr $ra
min: addi $sp, $sp, -4
sw $t1, 0($sp)
move $t1, $s0
lw $t1, 0($sp)
addi $sp, $sp, 4
jr $ra
max: addi $sp, $sp, -4
sw $t2, 0($sp)
move $t2, $s0
lw $t2, 0($sp)
addi $sp, $sp, 4
jr $ra
答案 0 :(得分:0)
我意识到您已经使用blt
和bgt
指令跳转到标签min和max。但是问题是这些实际上是函数(在mips汇编中也称为过程),并且正如您所看到的,我们在它们的末尾都有jr $ra
,这将pc(程序计数器寄存器)设置为等于$ra
,因此您必须将$ra
设置为适当的值。但是不用担心。您可以使用jal "function name"
轻松完成此操作。通过执行此操作,$ra
寄存器将被设置为正确的地址,该地址就是您呼叫jal "function name"
的下一行。
intro: .asciiz "Enter integer values, one perline, terminated by a negative value.\n"
total: .asciiz "\nSum: "
minn: .asciiz "\nMin: "
maxx: .asciiz "\nMax: "
mean: .asciiz "\nMean: "
.align 2
ARRAY: .space 400
.align 2
.text
.globl main
####################################
#$s1 = input counter
#$s2 = array address
#$t1 = min
#$t2 = max
#$s6 = sum
##########################################
main:
jal min
la $s2, ARRAY #array address
li $s6, 0 #sum
lui $t1, 0x7fff #min
ori $s3, $s3, 0xffff
li $t2, 0 #max
li $v0, 4 #ask user for numbers
la $a0, intro
syscall
LOOP:
li $v0, 5 #collect user input
syscall
move $s0, $v0
blt $s0, $zero, DONE
addiu $s1, $s1, 1 #add to counter
sw $s0, 0($s2) #store number in array
addiu $s2, $s2, 4 #get next array space
add $s6, $s6, $s0 #adding total sum
blt $s0,$t1,L1
bgt $s0,$t2,L2
#blt $s0, $t1, min
#bgt $s0, $t2, max
L1:
jal min
j L3
L2:
jal max
j L3
L3:
j LOOP
DONE:
li $v0, 4 #show sum
la $a0, total
syscall
li $v0, 1
move $a0, $s6
syscall
li $v0, 4 #show min
la $a0, minn
syscall
li $v0, 1
move $a0, $t1
syscall
jr $ra
min: addi $sp, $sp, -4
sw $t1, 0($sp)
move $t1, $s0
lw $t1, 0($sp)
addi $sp, $sp, 4
jr $ra
max: addi $sp, $sp, -4
sw $t2, 0($sp)
move $t2, $s0
lw $t2, 0($sp)
addi $sp, $sp, 4
jr $ra
我更改了bgt
和blt
指令,至少它对SUM的计算效果很好。希望对您有所帮助。