【发布时间】:2021-11-29 01:01:46
【问题描述】:
void sort (int v[], int n)
{
int i, j;
for (i = 0; i<n; i+=1){
for(j=i-1; j>=0; && v[j]>v[j+1]; j-=1){
swap(v,j);
}
}
}
void swap(int v[], int k)
{
int temp;
temp = v[k+1];
v[k+1]= temp;
}
下面是交换函数的MIPS代码
swap : sll $t1, $a0, 2 // reg $t = k*4
add $t1, $a0, $t1 // reg $t1 = v+(k*4)
// reg $t1 has the address of v[k]
lw $t0, 0($t1) // reg $t0 (temp) =v[k]
lw $t2, 4($t1) // reg $t2 = v[k+1]
// refers to next element of v
sw $t2, 0($t1) // v[k] = reg $t2
sw $t0, 4($t1) // v[k+1] = reg $t0 (temp)
jr $ra // return to calling routine
我正在学习计算机体系结构。通过几个过程,我们了解到不应该改变的值是使用堆栈指针存储的,或者存储在$S中。
但是,在上面的代码中,sort函数的参数v[]($a0)和n($a1)使用堆栈指针存储在$s0$s1中,并且在运行之前最里面的循环,$s0 in $a0,数据显示为将$s1的值赋给$a1。
但是,在上面的代码中,v[] 必须在 swap 函数内部保持更改后的状态,而j 也必须在循环时更改值,因此无需保存和放入之前的值。
我的解释正确吗?即在MIPS中实现上述代码时,使用栈指针不存储在$s中是没有问题的?
【问题讨论】:
标签: mips cpu-registers preserve