将C ++转换为MIPS。帮帮我查一下

时间:2013-10-16 12:59:47

标签: c++ assembly mips

我的答案在下面,请帮我查一下。非常感谢你!

将以下内容翻译成MIPS汇编语言

 void sort(int v[], int n)

 {    int i,j;

      for (i=1; i<n; i++) {
          j=i-1;
          while (  (j >=0) && (v[j] >v[j+1])) {
              swap (v[j], v[j+1]);
              j=j-1:
          }
      }
 }

数组的开头位于$4。 n传递给$5。假设存在交换过程,它期望v[j]$4的地址和v[j+1]$5的地址

这就是我所拥有的

        lw $8, 0($4)
        li $6, 1
loop    beq $6, $5, exit
        addi $6, $6, 1
        addi $7, $6, -1

        bltz $7, eit
        lw  $9, 0($4)
        slti $10, $9, $8
        beq $10, $0, exit
        swap
        addi $7, $7, -1
        j   loop

出口

此外,qn似乎暗示我可能需要使用堆栈指针。但我不知道怎么做,我认为它可以在不使用堆栈寄存器的情况下进行组装。你们觉得怎么样?

2 个答案:

答案 0 :(得分:1)

一些事情...... 首先,我认为这应该退出,而不是退出。

bltz $7, eit

其次,你想在这做什么?如果我理解正确,数组v []的开始是4美元。所以在这里你将v [0]加载到$ 9。

lw  $9, 0($4)

第三,你不能使用带有3个寄存器的slti。它“设置不到立即”。

slti $10, $9, $8

第四,关于堆栈寄存器。调用过程(例如代码中的交换函数)时,必须将参数保存在正确的寄存器中。你说它期望v [j]在4美元,v [j + 1]在5美元。在sort函数中,你有$ 5存储,所以你需要将n保存到堆栈中,以确保它不被嵌套函数调用覆盖。 可以这样做:

addi $sp, $sp, -4    # makes room for one word on stack
sw $5, 0($sp)        # store n on the stack

对于这个具体的例子,在第一次调用swap之后,你的n值会被提供给$ 5交换的参数覆盖,你的for循环将不正确,因为它无法评估

i < n

正确。 当您从交换回来时,您可以通过以下方式从堆栈中恢复值:

lw $5, 0($sp)       # restore n
addi $sp, $sp, 4    # readjust stack pointer

在安全地调用交换之前,您需要一些必要的步骤... 您的阵列寻址似乎也已关闭。也许回过头来看看如何在MIPS中正确地处理数组。话虽如此,我来这里是为了帮助,所以任何进一步的问题都可以随意提出。

答案 1 :(得分:0)

试试this?它是一个代码转换器。