2012-03-31 7 views
1

Я не могу понять, что я делаю неправильно в своем ассемблере. Я пытаюсь написать программу, которая сравнивает два нуля строки, которые вводятся в $ a0 и a1 $ где-то во время «главного:» раздела, а затем вызываетПростая сборка MIPS

jal hamming 

, чтобы запустить программу.

В основном для этого раздела Я хочу, чтобы две строки были сопоставлены символом char, пока одна строка не обрушилась на нуль-завершающий символ. Затем программа останавливается и возвращает количество символов различно до завершения.

Я думаю, что это связано с прыжками, которые я использую, но я не совсем уверен. Программа является своего рода долго, так что я взял главный кусок, который я думаю, что это проблема (а значит игнорировать переменные, такие как $ a3, который был инициализирован и определен уже):

diffchar: 
     li $t4, 0 
     li $t5, 1 

     beq $a0, $a1, samechars 
     move $v0, $t5 
     j diffcharend 

samechars: 
     move $v0, $t4 

diffcharend: 
     jr $ra 

hamming: 

absvaluedone: 
     li $a2, 0 
     #li $v0, 0 

     move $t0, $a0 
     move $t1, $a1 

hammingloopbegin: 
     lb $t2, 0($t0) 
     lb $t3, 0($t1) 
     beq $t2, $0, hammingdone 
     beq $t3, $0, hammingdone 

     la $a0, 0($t0) 
     la $a1, 0($t1) 
     jal diffchar **#this is the line that causes me problems, if I take this out it is fine** 
     beq $v0, $0, next 
     addiu $a2, $a2, 1 

next: 
     addiu $t0, $t0, 1 
     addiu $t1, $t1, 1 
     j hammingloopbegin 

hammingdone: 
     add $v0, $a2, $a3 
     jr $ra 

Когда я бегу моя программа моих выходных выглядит как бесконечный цикл, который твердит:

Exception occurred at PC=0x00400144 
    Bad address in data/stack read: 0x10021226 
    Exception 7 [Bad address in data/stack read] occurred and ignored 
Exception occurred at PC=0x00400140 
    Bad address in data/stack read: 0x1002121b 
    Exception 7 [Bad address in data/stack read] occurred and ignored 

Я думаю, что есть что-то не так с diffchar или процесса я использую, чтобы прыгать вокруг diffchar. Это мой первый раз, когда я писал код ассемблера, поэтому я считаю, что что-то действительно базовое, я не хватает, что делает этот беспорядок. Любые указатели были бы замечательными.

Спасибо за помощь

ответ

2

Вы не сохраняете обратный адрес перед jal diffchar. Он возвращается, и $ra сохраняет новое значение. Когда вы снова нажмете jr $ra в hammingdone, вы прыгаете вправо после звонка diffchar. Вам нужно сохранить $ra где-то перед вызовом diffchar и восстановить его после возврата вызова.

Вот good explanation of nested procedures in MIPS, который описывает проблему, которую вы испытываете, и решение с использованием стека выполнения:

Когда jal B команда выполняется, обратный адрес в регистре $ra для процедуры A будут перезаписаны с обратным адресом для процедуры . Процедура B вернется правильно к A, но когда процедура A выполняет инструкцию jr, она снова вернется к обратному адресу для B, который является следующей инструкцией после jal B в процедура A. Это ставит процедуру A в бесконечный цикл.

...

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

Обратный адрес в регистре $ra может быть в стек системы со следующим кодом Mal: ​​

sw  $ra, ($sp) 
    add  $sp, -4 

Следующий код выскакивает адрес возврата из верхней части стека и возвращает его в регистре $ra

add  $sp, 4 
    lw  $ra, ($sp) 
Смежные вопросы