将C ++代码转换为MIPS,MIPS中的代码运行时没有错误消息,但不显示结果

时间:2012-05-15 10:20:16

标签: c++ floating-point mips

作业要求我们在MIPS中完成代码。最初的MIPS代码需要一个我们必须从C ++代码翻译的函数。我根据需要将函数从C ++转换为MIPS。

MIPS中的代码在运行时不会显示任何错误。但是,代码不显示任何内容。

我尝试调试它,但我仍然没有看到问题所在。我使用Notepad ++作为编辑器,使用QtSpim运行MIPS代码。我发布了代码(首先是C ++,然后是MIPS)。我们将非常感谢您的帮助。

//*************C++ Code***********************

 #include <stdio.h>
 void update(float *, float *);
 int main() 
 {
   float x[5] = {.1, .2, .4, .6, .85};
   float vx[5] = {-.2, -.15, .05, -.2, .2};
   int i, steps;

   for (i=0; i<5; i++) 
   {
      printf("%d %f %f\n", i, x[i], vx[i]);
   }

  for (steps=0; steps<3; steps++) 
  {
      update(x, vx);
      printf("Step %d\n", steps);
      for (i=0; i<5; i++) 
      {
        printf("%d %f %f\n", i, x[i], vx[i]);
      }
  }
}

void update(float pos[], float vel[]) 
{
  int i;
  for (i=0; i<5; i++) 
  {
    pos[i] += vel[i];
    if (pos[i] < 0.) 
    {
       pos[i] = 0.;
       vel[i] = - vel[i];
    }
    else if (pos[i] > 1.) 
    {
       pos[i] = 1.;
       vel[i] = - vel[i];
    }
  }
}

//************************End of C++ Code*************************
//**************************Code Translated in MIPS*************

        .data
x:      .float  0.1
        .float  0.2
        .float  0.4
        .float  0.6
        .float  0.85
vx:     .float  -0.2
        .float  -0.15
        .float  0.05
        .float  -0.2
        .float  0.2
zero:   .float  0.
one:    .float  1.
space:  .asciiz " "
endl:   .asciiz "\n"
outStep:.asciiz "Step "

# i     $s0
# steps $s1
# &x[0] $s2
# &vx[0] $s3

        .globl  for

        .text
main:   la      $s2, x
        la      $s3, vx
        move    $t2, $s2
        move    $t3, $s3
        li      $s0, 0          #  for (i=0; i<5; i++) {
ploop:  move    $a0, $s0        #    printf("%d %f %f\n", i, x[i], vx[i]);
        li      $v0, 1
        syscall
        la      $a0, space
        li      $v0, 4
        syscall
        l.s     $f12, ($t2)
        li      $v0, 2
        syscall
        la      $a0, space
        li      $v0, 4
        syscall
        l.s     $f12, ($t3)
        li      $v0, 2
        syscall
        la      $a0, endl
        li      $v0, 4
        syscall
        addi    $t2, $t2, 4
        addi    $t3, $t3, 4
        addi    $s0, $s0, 1     #  }
        blt     $s0, 5, ploop

        li      $s1, 0          #  for (steps=0; steps<3; steps++) {
loop:   move    $a0, $s2        #    update(x, vx);
        move    $a1, $s3
        jal     update

        la      $a0, outStep    #    printf("Step %d\n", steps);
        li      $v0, 4
        syscall

        move    $a0, $s1
        li      $v0, 1
        syscall

        la      $a0, endl
        li      $v0, 4
        syscall

        move    $t2, $s2
        move    $t3, $s3
        li      $s0, 0          #    for (i=0; i<5; i++) {
ploop1: move    $a0, $s0        #      printf("%d %f %f\n", i, x[i], vx[i]);
        li      $v0, 1
        syscall
        la      $a0, space
        li      $v0, 4
        syscall
        l.s     $f12, ($t2)
        li      $v0, 2
        syscall
        la      $a0, space
        li      $v0, 4
        syscall
        l.s     $f12, ($t3)
        li      $v0, 2
        syscall
        la      $a0, endl
        li      $v0, 4
        syscall

        addi    $t2, $t2, 4
        addi    $t3, $t3, 4
        addi    $s0, $s0, 1
        blt     $s0, 5, ploop1

        addi    $s1, $s1, 1
        blt     $s1, 3, loop

        li      $v0, 10
        syscall

# void update(float pos[], float vel[]) {
# arg0 $a0
# arg1 $a1
# i $s0
update: l.s     $f30, zero
        l.s     $f31, one

# The function i translated in MIPS is right bellow

        addi    $s0,$s0,0      # i=0


        add.s $f0, $f0, $f1     # pos[i] += vel[i];
        c.lt.s $f0, $f30        # if (pos[i] < 0.) {
        bc1f    else           
        add.s   $f0, $f0, $f30   # pos[i]=0;
        sub.s   $f1, $f30 , $f1  
        sub.s   $f31, $f30, $f31 
        add.s   $f1, $f1, $f31   # vel[i] = - vel[i];          
        blt     $s0, 5, update

else :  c.lt.s  $f31, $f0      #else if (pos[i] > 1.) {
    bc1f    skip
        add.s   $f0, $f0, $f31
        sub.s   $f31, $f30, $f31
        sub.s   $f1, $f1, $f31
        blt     $s0, 5, update


skip :  add $s0, $s0, 0   
    addi $s0, $s0, 1
    slti $t1, $s0, 5
        blt  $s0, 5, update 


end:    jr      $31             #}

1 个答案:

答案 0 :(得分:0)

我在PCSpim中尝试过,但将.globl for更改为.globl main。现在有输出,但您的更新功能尚未按预期工作。您使用$f0$f1,但这些永远不会被加载或存储,因此没有更新。