MIPS指令集

MIPS指令集

mips (risc 精简指令集)

寄存器

mips 有32个寄存器,编号是从$0到$31

没有强制规则,但约定用法还是引入了一堆约定名

尽量使用约定名或者叫助记符

下面是寄存器用法(截的scdn [En Takahashi]老哥的),这些东西不一定要记,尽量还是用到多查,时间久了也就记住了

image-20220402141050555

比较特殊的是

$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指令分为三种格式

  1. R-format 其他所有的
  2. I-format 有立即数的指令
  3. J-format 无条件跳转

R-format

对非立即数和跳转的操作

例如:add $8, $17, $18 =》 $18 = $8+$17

image-20220402141057353

I-format

数据放到寄存器,或者放入地址

分支(判断)指令

立即数运算

image-20220402141102389

J-format

跳转,类似于jump

image-20220402141108000

常用汇编指令

上边指令分类其实只是一个理解,详细的看下边

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


MIPS指令集
http://example.com/article/6a1d16f9.html
Author
p1yang
Posted on
August 10, 2021
Licensed under