C к MIPS проблемы - PullRequest
       1

C к MIPS проблемы

3 голосов
/ 26 марта 2012

Итак, я работаю над этим уже несколько дней, и мне удалось пройти через все это, за исключением того, что одна часть получает меня.

int mystery(int a0)
{
    if (a0 == 0)
    {
        return 0;
    }
    else
    {
        return mystery(a0 - 1) + a0;
    }
}

У меня есть эта рекурсивная функция, и у меня есть некоторый код MIPS. Код на C работает, но у меня есть проблема где-то в моем коде MIPS, из-за которой он не выходит корректно после ввода 2.

.text

main:

li $a0, 2
jal mystery
move $a0, $v0
jal putDec
li $a0, '\n'
li $v0, 11
syscall

li $a0, 3
jal mystery
move $a0, $v0
jal putDec
li $a0, '\n'
li $v0, 11
syscall

li  $v0, 10     
syscall

putDec: 
    li $v0, 1
    syscall 
    jr  $ra     

mystery: 
 bne $0, $a0, recur 
 li $v0, 0      
 jr $ra             

  recur: 
sub $sp, $sp, 8     
sw $ra, 4($sp)  
sub $a0, $a0, 1
jal mystery         
sw $v0, 0($sp)  
jal mystery         
lw $t0, 0($sp)  
addu $v0, $v0, $t0  
addu $v0, $v0, 1    
add $a0, $a0, 1     
lw $ra, 4($sp)  
add $sp, $sp, 8     
jr $ra      

Все, вплоть до надписи «тайна», прекрасно, это просто формальность, чтобы фактически приводить аргументы и печатать после. У меня проблема с получением значений выше 3, чтобы распечатать правильные числа. Буду признателен за помощь, если кто-то может увидеть, где я делаю свою ошибку. Спасибо

Ответы [ 3 ]

3 голосов
/ 26 марта 2012

Попробуйте сделать шаг назад и сравнить структуру кода C и ассемблера, не слишком заботясь о деталях.

В коде C есть условное выражение,приводя либо к базовому случаю (который просто возвращает значение), либо к рекурсивному случаю.Рекурсивный регистр выполняет вычитание, рекурсивный вызов mystery и сложение.

Теперь посмотрим на версию сборки: здесь также есть условное условие, приводящее либо к базовому, либо к рекурсивному случаю.Но посмотрите на структуру рекурсивного случая: там два рекурсивных вызова mystery!Это сильный намек, что вряд ли он будет делать то же самое ...

0 голосов
/ 27 марта 2012

вы должны вернуть символ ASCII, замените "li $ v0, 1" в putDec на "li $ v0, 11" (это не было ошибкой)

0 голосов
/ 26 марта 2012

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

Новая функция рекурсивной загадки:

mystery: 
 bne $0, $a0, recur     
 li $v0, 0      
 jr $ra             

 recur: 
  sub $sp, $sp, 8   
  sw $ra, 4($sp)    
  sw $a0, 0($sp)
  sub $a0, $a0, 1   
  jal mystery       
  lw $t0, 0($sp)    #
  addu $v0, $v0, $t0    
  lw $ra, 4($sp)    
  add $sp, $sp, 8   
  jr $ra        

Еще раз спасибо. :)

...