MIPS :循环进入无穷大

MIPS : loop goes to infinity

本文关键字:无穷大 循环 MIPS      更新时间:2023-10-16

我正在尝试将此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

可以在这里帮忙。我尝试了很多,但无法使其正常运行。

编辑:字节ToDec的C++函数

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

MIPS 中的字节ToDec:

    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

您使用t3作为循环计数器,然后在byteToDec函数中丢弃t3。MIPS惯例是t寄存器是"临时的",不能在这样的函数调用中使用。你应该把你的循环变量放在一个s寄存器(一个"save"寄存器(,如果你被调用的函数需要重用同一个s寄存器,它需要把它保存到堆栈或其他东西,并在返回给被调用方之前恢复值。

我有一个程序,它的第一个循环工作,但第二个到第六个循环转到 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;
    }