🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## MARS MIPS Simulator [汇编编辑器](http://courses.missouristate.edu/kenvollmar/mars/download.htm) ``` brew install mars ``` ## if-else ``` if (i==j){ f=i+j }else{ f=i-j } ``` 汇编 ``` bne $r3,$r4,ELSE add $r5,$r3,$r4 j EXIT ELSE: sub $r5,$r3,$r4 EXIT: ``` ## for loop ``` sum=0 for (i=0;i<100;i++){ sum+=i } ``` 汇编 ``` addi $r3,$zero,0 #sum=0 addi $s4,$zero,0 #i=0 addi $s5,$zero,100 #常数 100 LOOP: beq $s4,$s5,EXIT add $s3,$s4,$s3 #sum=sum+i addi $s4,$s4,1 j LOOP EXIT: ``` ## 实现递归 ``` //目标 fact(5) // 汇编实现 addiu $s0,0,5 #存入参数5到so sw $s0,$sp #将s0写入sp addi $sp,$sp,-4 #栈指针指向下(压栈) jal FACT #跳转 ``` > 栈的内存地址是从大到小 ``` //目标 函数体 // 汇编实现 lw $s0,4($sp) #读取栈指针加4的值存到$s0中,即读取参数5, ``` ``` // 目标 在函数体最前 //汇编 sw $ra,0$(sp) #将函数调用位置压栈 addiu,$sp,$sp,-4 #栈指针 lw $t1,4($sp) #读取函数调用位置到 t1 lw $s0,8($sp) #读取参数 ``` ``` //目标 return jr $t1 # 跳转回调用位置 ``` 完整递归示例 ``` function fact(int n){ if( n == 0){ return 1 } return fact(m-1)*n } ``` 汇编 ``` ```