title: MIPS : loop goes to infinity
body: <p>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</p>
  
  <p>C++ function code :</p>
  
  <pre><code>      void IPtoDD(int arg0, char *arg1)
        {
        int temp, numChar, shift = 24;
  
        for (int i=0; i&lt;4; i++) {
        temp = arg0 &gt;&gt; shift;
        temp = temp &amp; 0x000000ff;
        numChar = byteToDec(temp,arg1);
        arg1 += numChar;
        *arg1++ = '.';
        shift -= 8;
        }
        arg1--;
        *arg1 = 0;
  
        return;
        }
  </code></pre>
  
  <p>MIPS code : </p>
  
  <pre><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
  </code></pre>
  
  <p>Could please help out here. I tried a lot but not able make it run correctly.</p>
  
  <p>edit:
  C++ function for byteToDec</p>
  
  <pre><code>    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;
      }
      }
  </code></pre>
  
  <p>byteToDec in MIPS:</p>
  
  <pre><code>    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
  </code></pre>