mips
[Mars基本用法参考](https://jingyan.baidu.com/article/ea24bc39c04b76da62b3313c.html#:~:text=方法%2F步骤 1%2F11 分步阅读 首先在官网下载Mars 4.5。,是一个4MB的Jar可执行文件。 如果电脑上已经装有Java运行库就可以直接运行了。 2%2F11 打开MARS,点击左上角的File菜单,选择New或者Open (一个asm格式文件).如图我们新建了一个。)
赋值
ori $t2,100
将t2寄存器的值赋值为100,其实是”100或上0“的结果给t2寄存器li $t1,100
将t1寄存器的值赋值为100,li
是伪指令,表示立即加载
传值
move $t1,$t2
,将t2寄存器的值传递给t1寄存器,同时t2寄存器中的值不改变
运算
- 加法:
add $t1,$t2,$t3
,将t2寄存器的值和t3寄存器的值相加给t1寄存器,这里公式里面可以包含数字,比如add $t1,$t2,100
,100也可以换成负数 - 减法:
sub $t1,$t2,$t3
- 乘法:
mul $t1,$t2,$t3
- 除法:
div rs, rt
,商放在LO
寄存器中,余数放在HI
寄存器中,如果rt寄存器的值为0,那么结果不可预料 - 使用
mfhi和mflo
来分别读取HI和LO寄存器
1 | li $t1,5 #被除数5 |
输入输出(scanf与printf)
v0
寄存器的值与syscall
(系统调用)是紧密联系的,也就是v0
的值决定了syscall是输入还是输出,输入/输出是字符串还是数字
1 | li $v0,5 |
这段代码表面含义:把v0寄存器的值赋值为5,然后进行系统调用。
实际含义:读入一个整数,整数的值存储于v0中。也就是v0寄存器的值为5,决定了syscall为读入一个整数,并将读入的整数存储在v0寄存器中。具体对应值参考mars的help
第一个程序
1 | li $v0,5 |
判断
跳转指令ble
ble $t1,6,lable1
如果t1寄存器的值小于等于6,则跳转到lable1处,否则,执行ble下一条指令
1 | li $t1,5 |
1 | li $t1,5 |
1 | li $t1,5 |
循环
1 | li $t1,0 |
使用判断语句和loop即可实现循环
数组
mips代表一般有两部分,.data和.text
,前面的内容都是.text
部分,对于数组的使用需要使用.data
段。
在.data定义一个起始地址为array,空间为400的数组,然后再.text写代码
1 | .data |
使用数组之前,需要将数组的首地址赋值给一个寄存器,用la
指令
la $t1,array
int占4个字节,以下是赋值方式,在此表示方法下,需要sw(存)
和lw(取)
来赋值和取值
1 | li $t2,3 |
完整代码
1 | .data |
在.data里加一句`a:.asciiz","
想要输出逗号的地方加一句
1 | la $a0,a |
数组的赋值还有别的写法,这种写法适合循环赋值
1 | .data |
宏
.marco
开始.end_macro
结束
1 | .macro RI(%i) |
递归
jal
指令,跳转到相应位置,并将现在的指令位置存储在ra寄存器中,当跳转结束后可由jr $ra
指令返回,返回值存储在v0寄存器中
1 | li $a0,1 |
sp
指针,sp指针可以分配空间
栈通常由高地址向低地址生长,$sp指向栈顶,也就是最高地址
- 数据入栈时,让sp减小
- 数据出栈时,sp增大
1 | addi $sp,$sp,-8 |
可以理解为分配了8个单位的空间,可以用来存储数据
1 | sw $t1,0($sp) |
无论如何修改寄存器t1,t2的值,只要如下操作,t1,t2就会恢复原本的值
1 | lw $t1,0($sp) |
最后别忘了加回来指针
1 | addi $sp,$sp,8 |
下面时一份递归代码,输出f(3)
1 | int f(x){ |
其对应的汇编代码为:
1 | li $a1,3 |
mips总结
寄存器表,记录常见寄存器的用途与编号规则
Name | Reg.Num | Usage |
---|---|---|
zero | 0 | 恒为0 |
at | 1 | 为汇编程序保留 |
v0~v1 | 2~3 (2的1次幂) | 过程调用返回值 |
a0~a3 | 4~7 (2的2次幂) | 过程调用参数(函数参数) |
t0~t7 | 8~15 (2的3次幂) | 临时变量 |
s0~s7 | 16~23 (2的4次幂) | 保存 |
t8~t9 | 24~25 | 临时变量 |
k0~k1 | 26~27 | 为OS保留 |
gp | 28 | global pointer |
sp | 29 | stack pointer |
fp | 30 | frame pointer |
ra | 31 | return address |