将以下高级代码转换为MIPS汇编代码

将以下高级代码转换为MIPS汇编代码,mips,Mips,我已经把这个C程序翻译成MIPS汇编代码。 所以,我想知道: 我做错什么了吗 如果我的汇编代码是正确的,我可以通过减少 指令数。我在这里使用了14个说明 下面是我转换这个C程序的方法 这是我的MIPS汇编代码 #s0=res 这是高级C程序 int main(){ int res; res = division (27, 3); } int division(int x, int y) { int i; int val = 0; for (i =

我已经把这个C程序翻译成MIPS汇编代码。 所以,我想知道:

  • 我做错什么了吗
  • 如果我的汇编代码是正确的,我可以通过减少 指令数。我在这里使用了14个说明
  • 下面是我转换这个C程序的方法 这是我的MIPS汇编代码

    #s0=res

    这是高级C程序

    int main(){
    
        int res;
        res = division (27, 3);
    
    }
    
     int division(int x, int y)
    {
        int i;
        int val = 0;
        for (i = x; i>0; i = i-y){
            val = val + 1;
        }
    
        return val;
    }
    
    
    错误:

    关系被错误地否定。您已将其翻译为

    for ( i = x; i >= 0; i -= y )
    
    因此,它将循环一次(当整数除法精确时)。您知道循环条件测试要求对程序集的if goto标签样式进行否定:

    if ( ! (i > 0) ) goto break;
    

    然而,
    !(i>0)
    i“我做错什么了吗?”听起来像是你可以用类似SPIM或MARS的模拟器来测试自己。单步测试,看看它是否达到了你的预期。嗨,@Erik我们能解决(i=x;i>=0;i-=y)的
    错误吗?是的。MIPS没有
    sle
    作为直接指令(一些汇编器会对此进行扩展),但有两种其他方法可以反转/求反:一种工具是交换
    slt
    的操作数,另一种是反转/求反分支(假分支与真分支)$0代替bne$0在这两种方法之间,我们可以实现任何关系运算符。例如,a b),这与!(b完成;但是现在我们需要转移到false上,所以我们使用
    beq$t0,$0,label
    。希望你能明白。
    if ( ! (i > 0) ) goto break;