mips笔记-指令
1. 寄存器
mips下一共有32个通用寄存器
汇编语言中,寄存器标志以$开头
寄存器的访问,可以直接使用$0..31(如$0),也可以使用define的名字,如下:
2. 程序结构
基本与gcc汇编一致
.data开始定义数据段
.text开始定义代码段
3. 几个常用的汇编指令
如果要访问内存, 只能使用load\stor指令
指令中一些字符的含义:
b, 一般指byte(1个字节)
w, 一般指word(4个字节)
3.1 load
lb reg_dest, ram_src // 将内存ram_src中的1字节数据载入(load)到reg_dest寄存器
lw reg_dest, ram_src // 将内存ram_src中的1个word(4字节)数据载入(load)到reg_dest寄存器
3.2 store
sb reg_src, ram_dest // 将reg_src中的一个byte数据写入到ram_dst中
sw reg_src, ram_dest // 将reg_src中的一个word数据写入到ram_dst中
3.3 li(load immediate)
li reg_dest, value // 加载立即数到寄存器
4. 寻址
4.1 la(load address)
la $t0, var1 // 将变量var1的值装入$t0
4.2 间接寻址,地址是寄存器的内容(类似于指针)
lw $t2, ($t0) // 将t0寄存器ram地址的内容,载入t2寄存器(t0寄存器的值是ram地址)
sw $t2, ($t0) // 将t2寄存器的值写入到t0寄存器指定的ram地址
4.1 偏移量操作
lw $t2, 4($t0) // 将t0寄存器值+4的地址中的数据,装入到t2寄存器
sw $t2, -4($t0) // 将t2寄存器的值写入到地址$t0-4
5. 算术指令
最多有3个操作数
操作数只能是寄存器
所有指令统一是32位
add $t0, $t1, $t2 // $t0 = $t1 + $t2, 这个是有符号的操作
addu $t0, $t1, $t2 // $t0 = $t1 + $t2, 这个是无符号的操作
sub[u] $t2, $t3, $t4 // $t2 = $t3 - $t4, u表示有符号操作
addi $t2, $t3, 5 // $t2 = $t3 + 5, add immediate(不能subi)
mult $t3, $t4 // 结果保存在hi, lo寄存器
div $t3, $t4 // Lo = $t3 / $t4
// Hi = $t3 %t4
Lo, Hi寄存器不支持直接获取,需要使用mfhi, mflo指令
mfhi $t0 // $t0=Hi
mflo $t1 // $t1=Lo
move $t2, $t3 // $t2 = $t3
6. 控制指令
6.1 Branches(分支, if-else)
b target // 直接跳转
beq $t0, $t1, target // if ($t0==$t1) 条件跳转
blt $t0, $t1, target // if ($t0<$t1) 条件跳转
ble $t0, $t1, target // if ($t0<=$t1) 条件跳转
bgt $t0, $t1, target // if ($t0>$t1) 条件跳转
bge $t0, $t1, target // if ($t0>=$t1) 条件跳转
bne $t0, $t1, target // if ($t0!=$t1) 条件跳转
6.2 Jumps(跳转:while-for-goto)
j target // 直接跳转
jr $t1 // 直接跳转到$t1寄存器的地址处
6.3. jump and link子程序调用(需要返回)
jal sub_function // 调用函数sub_function, 调用前$ra=pc, 保存当前值