Mips函数参数和返回值

时间:2017-01-04 15:03:33

标签: mips

我试图使用mips程序集创建哈希表。我的InsertKey函数由于某种原因无法正常工作。当我尝试使用它时,控制台只是冻结而没有错误消息。

InsertK:
    li $v0, 4
    la $a0, enterIntPrompt
    syscall
    li $v0, 5
    syscall
    move $a0, $v0  # key in a0
    li   $t0, 0
    la   $a1, Hash # table address in a1
    bgt  $a0, $t0, JInsertKey
    li   $v0, 4
    la   $a0, notInsertKeyMes
    syscall
    j whileloop
    JInsertKey:
        jal InsertKey
        j   whileloop

我怀疑我在某个地方搞砸了我的传球价值,但我找不到任何东西。教科书说,将$v0 - $v2寄存器用于函数调用的返回值和$a0 - $a3用于函数参数是一种很好的做法。 这是调用InsertKey函数的代码:

InsertKey:
    jal FindKey
    move $t0, $v0 # position in t0
    li   $t1, -1
    bne  $t0, $t1, prints
    bgt  $s1, $s0, dostuff
    li   $v0, 4
    la   $a0, hashTableFullMes
    syscall
    jr $ra
    dostuff:
    jal   HashFunction
    move  $t0, $v0
    li    $t3, 4
    multu $t0, $t3
    mflo  $t3
    la    $a1, Hash
    add   $a1, $a1, $t3 # a1 adress hash[position]
    sw    $a0, ($a1)
    addi  $s0,1
    jr    $ra
    prints:
        li $v0, 4
        la $a0, keyAlreadyInTableMes
        syscall
        jr $ra

FindKeyHashFunction正常运作。有人可以通过此代码识别问题吗?我真的没有想法..

修改Findkey返回找到的密钥的位置-1

1 个答案:

答案 0 :(得分:2)

InsertKey:
    jal FindKey

以上导致$ra的{​​{1}}被InsertKey + 8的地址覆盖,所以当InsertKey返回时,它会返回自身而不是其来电者

在调用任何其他函数之前,您需要保存InsertKey的返回地址和参数。