Malav Shah
Malav Shah

Reputation: 143

MIPS : loop goes to infinity

I am trying to convert this c++ function to mips. I think I am having problem in loop because when I run it, it gives me 13..1.17.5.. but my output should be two ip addresses : 130.52.0.10 and 171.9.50.186

C++ function code :

      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 code :

      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

Could please help out here. I tried a lot but not able make it run correctly.

edit: C++ function for 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 in 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

Upvotes: 0

Views: 420

Answers (2)

Jesse
Jesse

Reputation: 1

I Have a program and it the first loop works ell but the second to 6th loop goes to inf. I'm a beginner and could use some help

    #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;

    }

Upvotes: 0

Jim Buck
Jim Buck

Reputation: 20724

You are using t3 as your loop counter and then trashing t3 in your byteToDec function. MIPS convention is that t registers are "temp" and not to be used across function calls like that. You should put your loop variable in a s register (a "save" register), and if your called function needs to reuse that same s register, it needs to save it to the stack or something and restore the value before returning to the callee.

Upvotes: 1

Related Questions