我的答案在下面,请帮我查一下。非常感谢你!
将以下内容翻译成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似乎暗示我可能需要使用堆栈指针。但我不知道怎么做,我认为它可以在不使用堆栈寄存器的情况下进行组装。你们觉得怎么样?
答案 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?它是一个代码转换器。