2017-01-04 3 views
2

Я пытаюсь создать хэш-таблицу с использованием сборки mips. Моя функция InsertKey по какой-то причине не работает правильно. Консоль просто зависает без сообщения об ошибке, когда я пытаюсь ее использовать.Аргументы функции Mips и возвращаемые значения

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

Выполнение кода в отладчике поможет вам понять, почему он не работает: https://courses.missouristate.edu/KenVollmar/mars/Help/MarsHelpDebugging.html – markgz

+0

Я действительно сделал, пользуюсь QTSpim, и это просто сокрушает, когда я пытаюсь вставить номер –

ответ

2
InsertKey: 
    jal FindKey 

Вышеуказанные причины $ra для InsertKey быть перезаписаны с адресом InsertKey + 8, так что, когда InsertKey возвращается, он возвращается к себе, вместо того, чтобы ее вызывающему абоненту.

Вам нужно сохранить адрес и аргументы возврата для InsertKey, прежде чем он называет любые другие функции.

+0

Я люблю тебя. Спасибо большое .. Реальный головоломка .. –

Смежные вопросы