MIPS: цикл уходит в бесконечность

0

Я пытаюсь преобразовать эту функцию c++ в mips. Я думаю, что у меня проблема в цикле, потому что когда я запускаю ее, она дает мне 13..1.17.5.. но мой вывод должен быть двумя IP-адресами: 130.52.0.10 и 171.9.50.186

c++ код функции:

      void IPtoDD(int arg0, char *arg1)
      {
      int temp, numChar, shift = 24;

      for (int i=0; i<4; i++) {
      temp = arg0 >> shift;
      temp = temp & 0x000000ff;
      numChar = byteToDec(temp,arg1);
      arg1 += numChar;
      *arg1++ = '.';
      shift -= 8;
      }
      arg1--;
      *arg1 = 0;

      return;
      }

Код MIPS:

      IPtoDD: addi $sp, $sp, -20
      sw $ra, ($sp)
      sw $s0, 4($sp)
      sw $s1, 8($sp)
      sw $s2, 12($sp)
      sw $s3, 16($sp)
      move $s0, $a0
      move $s1, $a1
      li $s3, 24              #s3=shift
      li $s2, 0               #s2=i
      li $t5, 0               #t5=temp
      li $t3, 0
      move $s1, $a1           #s1=*arg1
 loop:   srl $t5, $s0, $s3       #t3= numChar
         and $t5, $t5, 0xff      #t4= (*arg1)
         move $a0, $t5
         move $a1, $s1
         jal byteToDec
         move $t3, $v0
         add $s1, $s1, $t3
         li $t5, '.'
         sb $t5, ($a1)
         addi $a1, $a1, 1
         addi $s3, $s3, -8
         addi $s2, $s2, 1
         blt $s2, 4, loop
         addi $s1, $s1, -1
         sb $0, ($a1)
         lw $s3, 16($sp)
 ra:     lw $s2, 12($sp)
         lw $s1, 8($sp)
         lw $s0, 4($sp)
         lw $ra, ($sp)
         addi $sp, $sp, 20
         jr $ra

Могли бы, пожалуйста, помочь здесь. Я много пробовал, но не смог запустить его правильно.

edit: функция c++ для byteToDec

    int byteToDec(int arg0, char *arg1)
    {
    int temp, flag = 0, count = 0;
    if (arg0==0) {
    *arg1 = '0';
    return 1;
    }
    else {
    temp = arg0/100;
    if (temp != 0) {
    *arg1++ = (char) temp + 0x30;
    count++;
    flag = 1;
    }
    temp = (arg0 % 100) / 10;
    if ((flag!=0) || (temp != 0)) {
    *arg1++ = (char) temp + 0x30;
     count++;
     }
     temp = arg0 % 10;
    *arg1 = (char) temp + 0x30;
    count++;
    return count;
    }
    }

byteToDec в MIPS:

    byteToDec:      #t0= temp
            #t1= flag
            #v0= count

            #t3= (*arg1)

         bne $a0, $0, else
         li $t3, '0'
         sb $t3, ($a1)
         li $v0, 1
         jr $ra
  else:   div $t0, $a0, 100
          beq $t0, 0, cont
 bp2:    addi $t3, $t0, 0x30
         sb $t3, ($a1)
         addi $a1, $a1, 1
         addi $v0, $v0, 1
         li $t1, 1
 cont:   rem $t3, $a0, 100
         div $t0, $t3, 10
        bne $t1, 0, nxtIf
         beq $t0, 0, endElse
  nxtIf:  addi $t3, $t0, 0x30
         sb $t3, ($a1)
         addi $a1, $a1, 1
         addi $v0, $v0, 1
 endElse:rem $t0, $a0, 10
 bp1:    addi $t3, $t0, 0x30
         sb $t3, ($a1)
         addi $v0, $v0, 1
 ra1:    jr $ra
Теги:
assembly
mips

2 ответа

1

Вы используете t3 как свой счетчик циклов, а затем перетаскиваете t3 в функцию byteToDec. Соглашение MIPS заключается в том, что t регистры являются "temp" и не могут использоваться в таких вызовах функций. Вы должны поместить свою переменную цикла в регистр s (регистр "save"), и если ваша вызываемая функция должна повторно использовать тот же самый s регистр, ему необходимо сохранить его в стек или что-то еще и восстановить значение перед возвратом в вызываемый,

  • 0
    Привет .. Спасибо за совет. Я сохранил i в качестве регистра, и он перестал работать в бесконечном цикле, но он по-прежнему дает мне много ошибок, как Exception 4 и Exception 7, и много адресов этих ошибок. Поможет ли мне использовать все временные регистры в обеих функциях?
  • 0
    Если остальная часть программы написана на C / C ++, она ожидает, что вы ответственно используете регистры s . Если вы используете s регистр, вам нужно сохранить дополнительное пространство в стеке, сохранить s регистры в стеке, затем использовать s регистры для того, что вы хотите, а затем восстановить значения s регистров из стека. Это звучит , как вы, вероятно , громя вызываемый абонент - й s регистром. Но, да, другая альтернатива - просто убедиться, что вы используете уникальные t регистры между двумя вашими функциями.
Показать ещё 1 комментарий
0

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

    #include <iostream>
    #include <cmath>
    #include <fstream>

    using namespace std;

    ofstream myfile ("Atomseries.txt");

    int main()
    {

        float rconstant=109677.58;
        int nstart, nend;
        int length;


        for (nstart = 1; nstart <= 6; nstart++){

            for (nend= 2; nend <=nstart + 10; nend++)

                length = 1/(rconstant*(1/(nstart*nstart)- 1/(nend*nend)));

                myfile << length * 10000000 << endl;

        }

          if (nstart = 1)
                myfile << "Lyman Series"<< endl;
                else
                    ;
            if (nstart = 2)
                myfile << "B Series" << endl;
                else
                    ;
            if (nstart= 3)
                myfile << "  series"<< endl;


         return 0;

    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню