汇编
最后更新于:2022-04-02 04:07:28
[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
}
```
汇编
```
```
';