我试图使用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
FindKey
和HashFunction
正常运作。有人可以通过此代码识别问题吗?我真的没有想法..
修改:Findkey
返回找到的密钥的位置-1
。
答案 0 :(得分:2)
InsertKey:
jal FindKey
以上导致$ra
的{{1}}被InsertKey
+ 8的地址覆盖,所以当InsertKey
返回时,它会返回自身而不是其来电者
在调用任何其他函数之前,您需要保存InsertKey
的返回地址和参数。