MIPS无法更改过程中的值

时间:2018-10-06 03:12:34

标签: assembly stack mips cpu-registers qtspim

嗨,我有这个程序,该程序应该从用户输入数字列表中找到总和,最小值和最大值。在我调用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

1 个答案:

答案 0 :(得分:0)

我意识到您已经使用bltbgt指令跳转到标签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

我更改了bgtblt指令,至少它对SUM的计算效果很好。希望对您有所帮助。