MIPS逆向(三)--汇编指令集

MIPS是定长指令集,MIPS32是32位长的指令,关于MIPS64可以查看https://www.cipunited.com/cn/product-det/mips64_2.html。这篇文章以MIPS32为例。

MIPS有三种指令格式:

R型

6 5 5 5 5 6
op rs rt rd shamt funct

 

 

功能:寄存器-寄存器ALU操作 (算术运算,逻辑运算)

I型

6 5 5 16
op rs rt 立即数操作

 

 

功能:条件分支,跳转

J型

6 26
op 跳转地址

 

 

功能:跳转

MIPS常用指令集

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)。
trap                                   根据地址向量转入管态。 
eret                                  从异常中返回到用户态。

算术类:
add/addu:       把两个定点寄存器的内容相加;u为不带符号加,如 rd = rs + rt

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 

32个通用寄存器

MIPS下一共有32个通用寄存器 ;在汇编中,寄存器标志由$符开头。寄存器表示可以有两种方式:直接使用该寄存器对应的编号,例如:从$0到$31;使用对应的寄存器名称,例如:$t1, $sp。

0       ($zero)      : 永远返回值为0 
1       ($at)          : 用做汇编器的暂时变量 
2-3    ($v0-$v1)  : 子函数调用返回结果 
4-7    ($a0-$a3)  : 子函数调用的参数 
8-15  ($t0-$t7)    : 暂时变量,子函数使用时不需要保存与恢复 
16-23($s0-$s7)  : 子函数寄存器变量。子函数必须保存和恢复使用过的变量在函数返回之前,从而调用函数知道这些寄存器的值没有变化。
24-25($t8-$t9)    : 暂时变量,子函数使用时不需要保存与恢复 
26-27($k0-$k1)  : 通常被中断或异常处理程序使用作为保存一些系统参数 
28     ($gp)        : 全局指针。一些运行系统维护这个指针来更方便的存取“static“和”extern”变量。
29     ($sp)        : 堆栈指针 
30     ($s8/$fp)  : 第9个寄存器变量。子函数可以用来做栈帧指针寄存器(相当于x86的bp寄存器) 
31     ($ra)         : 子函数的返回地 
cp0                    :协处理器0,MIPS对CPU的控制用cp0完成

 

posted @ 2018-10-09 20:27  An2i  阅读(8680)  评论(0编辑  收藏  举报