Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C MIPS程序集-带减法的if条件_C_Assembly_Mips - Fatal编程技术网

C MIPS程序集-带减法的if条件

C MIPS程序集-带减法的if条件,c,assembly,mips,C,Assembly,Mips,我用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, r

我用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;
}
如何将其转换为汇编代码?我首先需要使用sub指令减去N-1-I并将其存储在寄存器中,还是一个简单的等分指令可以做到这一点


完全初学者MIPS汇编在这里,任何建议或文件,你可以给我非常感谢

您必须将此结果存储到寄存器中,我建议为此使用一个临时寄存器。或者,如果您使用的是被呼叫方或呼叫方安全约定,则应相应地选择一个寄存器

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;

谢谢顺便问一下,下一行你怎么走<代码>parrj=(parr0+4*j)我的想法大致是
mul$t5,$t3,4#4*j in parrj=(parr0+4*j);添加$d、$s、$t
,然后在add指令中添加到parrj?但它是一个指针变量….$t3在汇编中设置为my j变量。如果我有如下指针变量这样定义:
.text la parr0,arr#char*parr0=(char*)arr;la parrj,($t3)#char*parrj
您可以在寄存器中保留
N-1
,并在函数的其余部分使用它而不是N。i、 e.您不必每次都在循环内重新计算
N-1
;MIPS有大量的寄存器,所以在所有循环之外执行一次。
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;