MIPS指令集
MIPS指令集
mips (risc 精简指令集)
寄存器
mips 有32个寄存器,编号是从$0到$31
没有强制规则,但约定用法还是引入了一堆约定名
尽量使用约定名或者叫助记符
下面是寄存器用法(截的scdn [En Takahashi]老哥的),这些东西不一定要记,尽量还是用到多查,时间久了也就记住了
比较特殊的是
$0号寄存器,他里边放的只有0,又叫0号寄存器
$31号寄存器,里边放的是函数调用指令的返回地址
$1号寄存器,又叫at,由编译器生成的复合指令使用
d
v0,v1不够用的话用内存
hi和lo是两个跟乘法相关的寄存器,不是通用寄存器,所以不能用在其他地方
寻址
寻址方式为地址 = 基地址+偏移
数据类型
c中 long int short char
mips dword word halfword byte
长度 8 4 2 1
指令
mips所有指令都是32位的
mips指令分为三种格式
- R-format 其他所有的
- I-format 有立即数的指令
- J-format 无条件跳转
R-format
对非立即数和跳转的操作
例如:add $8, $17, $18 =》 $18 = $8+$17
I-format
数据放到寄存器,或者放入地址
分支(判断)指令
立即数运算
J-format
跳转,类似于jump
常用汇编指令
上边指令分类其实只是一个理解,详细的看下边
lb / lh / lw : 从存储器中读取一个byte/half word/word的数据到寄存器中
sb / sh /sw: 把一个byte/half word/word的数据从寄存器存储到存储器中
mov / movz / movn: 复制,n为负,z为零。mov $1,$2; movz $1,$2,$3($3为零则复制$2到$1)
addi/addiu: 把一个寄存器的内容加上一个立即数;u为不带符号加。 rd = rs + im
sub/subu: 把两个定点寄存器的内容相减。 rd = rs - rt
div/divu: 两个定点寄存器的内容相除。
mul/mulu: 两个定点寄存器的内容相乘。
slt/slti/sltui: 如果rs的值小于rt,那么设置rd的值为1,否则设置rd的值为0。 rd = (rs < rt) ? 1 : 0 ; rd = (rs < im) ? 1 : 0
and/andi: 与运算,两个寄存器中的内容相与 ;i为立即数。 rd = rs & rt ; rd = rs & im
or/ori: 或运算。 rd = rs | rt ; rd = rs | im
xor/xori: 异或运算。 rd = rs ^ rt ;rd = rs ^ im
nor/nori: 取反运算。 rd = !(rs | rt)
j/jr/jal/jalr: j直接跳转 PC = { (PC+4) [31,28] , addr, 00};jr使用寄存器跳转 PC = rs; jal $31 = PC;PC = {(PC+4) [31,28],addr,00}
beq/beqz/benz/bne: 条件转移eq相等,z零,ne不等。 beq , PC = (rs == rt) ? PC+4+im << 2 : PC ; bne , PC = (rs != rt) ? PC+4+im << 2 : PC
lui: 把一个16位的立即数填入到寄存器的高16位,低16位补零。 rt = im * 65536(2^16)
lw: rt = memory[ rs + im]
sw: memory[ rs + im] = rt
sll/srl: 逻辑左移/右移。 rd = rs << shamt ; rd = rs >> shamt