MIPS汇编基础

MIPS寻址方式

MIPS的寻址方式有五种

1.立即数寻址:操作数是位于指令自身中的常数

image-20220411152740695.png

OP 代表指令类型

RS/TS 是寄存器的情况

Immediate(类比数) 要寻址的话根据类比数存放的值去寻址

2.寄存器寻址:操作数是寄存器
image-20220411153006871.png

从RS(寄存器)去查找我们想要存放的地址

3.基址寻址或偏移寻址:操作数在内存中,其地址是指令中基址寄存器和常数的和,如IW与sw指令

image-20220411153114168.png

RS和Address相加最后得出来结果,相加之前一定记得将地址偏移,根据情况一般偏移4位然后相加得到最后地址

4.PC相对寻址:地址是PC和指令中常数的和

image-20220411153326580.png

和上面的差不多,寄存器变成了PC寄存器

5.伪直接寻址:跳转地址由指令中26位字段和PC高位相连而成
image-20220411153505849.png

OP后面只跟了一个地址,然后和PC相运算

逆向分析或进行调试的时候调试器会帮我们把寻址方式整理出来,我们只需要知道在那里存放的位子

MIPS指令格式

一、MIPS Opcode

MIPS主要分为三种类型的格式

1.R格式指令为纯寄存器指令,所有的操作数(除移位外)均保存在寄存器中。Op字段均为0,使用 funct字段区分指令
2.I格式指令为带立即数的指令,最多使用两个寄存器,同时包括了load/ store指令使用Op字段区分指令
3.J格式指令为长跳转指令,仅有一个立即数操作数。使用Op字段区分指令
image-20220411153920694.png

二、MIPS Opcode 解析

image-20220411154203803.png
image-20220411154840044.png

日常中所看到的指令是十六进制0xAF8020,因为机器只能识别二进制数据,为了方便人看就编译成十六进制的形式,十六进制的二进制表示为图中显示

那如果变成我们的指令呢?

可以看到前三个图片,前六个字节可以区分类型 000 000 ,可以看到如上图是个R类型

然后他要做什么事情呢?

可以看到前两个图片,最后面六个字节(Funct)100 000,看如上图片对应的funct对应的100 000 可以看到是个add指令

完整的指令为 add 3.MIPS汇编(上) - 图9a1 ,$t7,那我们如何得到后面的内容呢?

可以看到前三个图片,RS为5个字节,00101(5位) 01111(代表1+2+4+8=15),15=>t7

image-20220411155920414.png

后面的 1000 0000 对应着$s0

IDA hr 是如何把二进制数据编程汇编指令的呢?

就是通过这种类型指令,通过手册进行对比,来确定接什么

MIPS汇编

可以大概分为算数运算(加减乘除)、移位运算(左移右移)、逻辑运算(与或非)、跳转指令(jump/长跳转/段跳转)、载入指令(load..)、……

1.ADD
image-20220411161634648.png

格式:ADD rd(存放数据的), rs, rt(相加存放到了rd里面)

例子:ADD $t0, $s1, $s2(寄存器放入t0)

除了ADD外还有如下不同的类型

ADD ADDIUPC

ADDI ADDU

ADDIU

指令没必要都去记,只需要记得常用的,其他指令可以参考PDF文档:…..

2.SLL
image-20220414102616072.png

格式:SLL rd, rt, sa

例子:SLL $1,$2,10 (这是一个<<左移指令把$2 左移10位,放到$1里面)

如下是不同的类型

SLLV SLTIU

SLT SLTU

SLTI

3.XOR
image-20220414103107641.png

格式:XOR rd, rs, rt

例子:XOR 1, $2, $3 (把$3和$2进行与或运算,存到寄存器里面)

XORI

4.MOVZ
image-20220414103335328.png

上图末尾可以看到类型为R指令

格式:MOVZ rd, rs, rt (与移动相关的指令,可以对寄存器进行操作)

例子:MOVZ R1, R2, R3 (如果R3是0 R2的值给R1)

MOVE MOVT

MOVF MOVZ

MOVN

5.BNE
image-20220414104228044.png

格式:BNE rs, rt, offset (他有一个跳转类型指令,更具偏移(offset)和我们的rs来指定跳转到哪里)

例子:BNE $1, $2, 10

B BC2TL

BAL BEQ

BC BEQL

6.LW

image-20220414105121763.png

格式:LW rt, offset(base) (取出域/拿出域,通过LW 将内存中base的位置 拿到rt寄存器里面)

例子:LW $1,10($2)

LW LWE

LWC1 LWL

LWC2 LWLE

请查看官方的手册MD00086-2B-MIPS32BIS-AFP-6.06.pdf,要么通读,要么按需理解

MIPS环境搭建

一、MIPS环境介绍

1.系统可以选择linux或者Windows,但是Windows是没有交叉编译工具的,建议安装虚拟机,安装ubuntu

2.MIPS 编译器MARS 4.5

3.交差编译 可以是gcc g++

编译器下载地址,通过java -jar mars…jar 启动

image-20220414110415574.png

如果没有mips的开发板,可以使用qemu去进行模拟

  1. 1.qemu 两种模拟模式:
  2. User mode:用户模式 (比如我下载执行某一个应用。这个应用需要非本地架构的 MIPS架构的,可以切换到mips处理器处理,成功执行完后退回到本机系统)
  3. System mode:系统模式 (系统模式就是完整的系统启动,可以加系统里面直接操作)

二.qemu安装

qemu 源码安装默认最新版

qemu命令安装可以针对 版本 软件库版本

这里推荐安装的qemu版本是6,最新版的qemu 兼容性会差一些

安装用户模式

  1. sudo apt-get install qemu-user-static

三.MIPS环境搭建

MIPS交叉编译链接工具-gcc-mips-linux-gnu

前三行内容都是去加载动态链接库然后去帮助我们编译应用程序

sudo apt-get install linux-libc-dev-mips-cross

sudo apt-get install libc6-mips-cross libc6-dev-mips-cross

sudo apt-get install binutils-mips-linux-gnu gcc-mips-linux-gnu

sudo apt-get install g++-mips-linux-gnu

MIPS交叉编译链接工具-gcc-mipsel-linux-gnu

sudo apt-get install linux-libc-dev-mipsel-cross
sudo apt-get install libc6-mipsel-cross libc6-dev-mipsel-cross
sudo apt-get install binutils-mipsel-linux-gnu gcc-mipsel-linux-gnu
sudo apt-get install g++-mipsel-linux-gnu

MIPS汇编实战

请根据如下代码进行学习,并运行,查看右边的寄存器的流程

image-20220414143503857.png

.text  //代码段

.globl main    //相当于导出main

main:    //函数名
    li $v0,4    //li展示指令,里面放个4 立即数,指第四种系统调用码
     la $a0, msg    //将msg放入$a0中用于下一步输出
    syscall    //系统调用指令,调用print_string输出mag的内容
    li $v0,10    //由4变成10对应的是exit
    syscall        //完成退出操作

     .data        //数据段,一个程序中会有大量的字符串,例如交互类字符串

msg:    .asciiz "Hello World\n"        //变量msg,对应值Hello World,通过syscall输出

1.mips系统调用码

https://blog.csdn.net/wucai/article/details/45034163

2.静态交叉编译MIPS程序

image-20220414143654726.png
image-20220414143706611.png
image-20220414143727053.png

3.动态交叉编译MIPS程序

image-20220414145850190.png
image-20220414145856378.png
image-20220414145929356.png

qemu-mipsel -L 加载动态链接库
image-20220414145459265.png

/usr/mips-linux-gnu/lib/ 里面就是动态链接库,里面有很多so文件
image-20220414145640897.png