我在C中有以下代码,表示冒泡排序算法:
#include <stdio.h>
int arr[5]={5,3,4,1,2};
int main(){
int k;
int N=5,i,j;
char * parr0 = (char*) arr;/* la parr0, arr */
char * parrj;
i=0;
for1:
if(i>=N) goto Endl; /* slt romp, ri, rN /// beq rcomp, $0, Endl*/
j=0;
for2:
if(j>=N-1-i) goto End2;
parrj = (parr0 + 4*j);
int x1 = ((int)parrj); /*load word from register x1 to 0(ppj) (lw x1,0(parrj) ~ replacement of arr[j]*/
int x2 = ((int)(parrj+4)); /*(lw x2,4(parrj) ~ replacement of arr[j+1]*/
if(x2 >= x1) goto SkipSwap;
((int)parrj) = x2; /*sw x2,0(parrj) ~ x2 -> arr[j]*/
((int)(parrj+4)) = x1; /*sw x1,4(parrj) ~ x1 -> arr[j+1]*/
SkipSwap:
j++;
for(k=0; k<N;k++) printf("%d ", arr[k]);
printf("\n");
goto for2;
End2:
i++;
goto for1;
Endl:
for(k=0; k<N;k++){
printf("%d ", arr[k]);
}
return 0;
}
我必须把它变成汇编代码。我对这条线路特别好奇:
if(j>=N-1-i) goto End2;
如何将其转换为汇编代码?我是否首先需要使用子指令来减去N-1-i并将其存储在寄存器中,还是可以使用简单的并行分支指令来实现?
在这里完成MIPS大会的初学者,非常感谢您给我的任何建议或文档!
答案 0 :(得分:1)
您必须将此结果存储到寄存器中,我建议使用其中一个临时寄存器。或者,如果您使用的是Callee或Caller Safe Conventions,则应相应地选择一个寄存器。
sub $t3, $t0, $t1 // assuming i is in $t1, N is in $t0 and j is in $t2
sub $t3, $t3, 1
bge $t2, $t3, End2
// MIPS for Lines following if(j>=N-1-i) goto End2;