物联网安全学习笔记之一——MIPS汇编语言基础 – 安全客,安全资讯平台 | xxx物联网安全学习笔记之一——MIPS汇编语言基础 – 安全客,安全资讯平台 – xxx
菜单

物联网安全学习笔记之一——MIPS汇编语言基础 – 安全客,安全资讯平台

十月 31, 2018 - 安全客

物联网安全学习笔记之一——MIPS汇编语言基础 - 安全客,安全资讯平台

第一次从事物联网安全相关的研究,发现很多知识需要从头学起。在努力学习之余,想发个系列文章,把学过的知识和走过的弯路都发出来,一来是督促自己,二来是希望和大牛们多学习。希望大家不吝赐教哟!

目前的物联网设备多是MIPS架构,那么就从MIPS汇编语言学起吧!

1 基础概念

MIPS(Microprocessor without Interlocked Piped Stages architecture),是一种采取精简指令集(RISC)的处理架构,由MIPS科技公司开发并授权,广泛应用在许多电子产品、网络设备、个人娱乐装置与商业装置上。最早的MPS架构是32位,最新的版本已经变成64位。

MIPS结构的基本特点是:包含大量的寄存器、指令数和字符、可视的管道延时间隙,这些特性使得MIPS架构能够提供最高的每平方毫米性能和当今SoC设计中最低的能耗。

我们平时听到很多CISC、RISC指令集,那么他们之间有什么关联呢?

 

2 寄存器

2.1 通用寄存器

在MIPS体系结构中有32个通用寄存器(每个寄存器大小根据芯片型号不同而不同,在一般情况下,32位处理器中每个寄存器的大小是32位,即4字节),在汇编程序中可以用编号$0~$31表示,也可以用寄存器的名字表示,如$sp、$t1、$ra等。堆栈是从内存的高地址方向向低地址方向增长的。

编号名称说明备注
$0$zero和0值作比较运算是常用该寄存器
$1$at汇编保留保留寄存器,不可做其他用途Assembler Temporary
$2~$3$v0~$v1存储函数的返回值。如果返回值为1字节,则只有$v0有效Values
$4~$7$a0~$a3作为函数调用时传递的前4个参数,不够时才使用堆栈传递Arguments
$8~$15$t0~$t7临时寄存器,无需保证函数调用的恢复Temporaries
$16~$23$s0~$s7函数调用后这些寄存器需要被恢复Saved Values
$24~$25$t8~$t9临时寄存器的拓展补充Temporaries
$26~$27$k0~$k1系统保留寄存器,请勿使用Kernel reserved
$28$gp全局指针,静态数据访问时需要保证在gp指定的64kb范围Global Pointer
$29$sp堆栈指针Stack Pointer
$30$s8/$fpSaved value / Frame Pointer
$31$ra存放函数调用返回的地址Return Address

2.2 特殊寄存器

MIPS32架构中定义了3个特殊寄存器,分别是PC、HI、和LO。这几个用的比较少,暂时先不介绍啦。

 

3 字节序

数据在存储器中是按照字节存放的,处理器也是按照字节访问存储器中的指令或数据的。如果要读出一个WORD(4bytes),那么有两种结果:

例如0x12345678在两种模式下的存储情况如下:

        低地址                    高地址 大端        12        34        56        78 小端        78        56        34        12 

 

4 MIPS指令集

4.1 MIPS指令特点

MIPS指令有一些特别的地方:

4.2 指令格式

MIPS指令长度为32位,其中指令位均为6位,其余的26位可以分为R型、I型、J型共3种类型。

R型 Opcode(6) Rd(5) Rs(5) Rt(5) Shamt(5) Funct(6)

I型 Opcode(6) Rd(5) Rs(5) Immediate(16)

J型 Opcode(6) Address(26)

各字段含义如下:

4.3 常用指令

在下文语法表述中寄存器前面使用”$”符号进行标注,“imm”表示立即数,“MEM[]”表示RAM中的一段内存,”offset“表示偏移量。

4.3.1 LOAD/STORE指令

语法:

la $Rd, Label 

示例:

la $t0, val_1    //复制val_1表示的地址到$t0寄存器中,其中val_1是一个Label 

语法:

li $Rd, imm 

示例:

la $t0, 40        //将寄存器$t1赋值为40 
lui $Rd, imm 

示例:

/* byte 1字节    8位 word 2字节    16位 dword 4字节    32位 以小端格式,0x42为例 */ lui $a1, 0x42    //将0x42放入$a1的高16位 

语法:

lw $Rt, offset($Rs) 

示例:

lw $s0, 0($sp)    //取堆栈地址偏移0内存word长度的值到$s0中,$s0 = MEM[$sp+0] 

语法:

sw $Rt, offset($Rs) 

示例:

la $Rd, Label 

0

语法:

la $Rd, Label 

1

示例:

la $Rd, Label 

2

4.3.2 算数运算指令

MIP汇编指令的特点如下:

la $Rd, Label 

3

4.3.3 类比较指令

在MIPS寄存器中没有标志寄存器,但是再MIPS指令中有一种指令——SLT系列指令,可以通过比较设置某个寄存器后与分支跳转指令联合使用。

la $Rd, Label 

4

la $Rd, Label 

5

la $Rd, Label 

6

la $Rd, Label 

7

4.3.4 系统调用指令

SYSCALL可以产生一个软中断,从而实现系统调用。

语法:

la $Rd, Label 

8

4.3.5 分支跳转指令

在MIPS中,分支跳转指令本身可通过比较两个寄存器中的值来决定是否跳转。要想实现与立即数比较的跳转,可以结合类跳转指令实现。

la $Rd, Label 

9

4.4.6 跳转指令

la $t0, val_1    //复制val_1表示的地址到$t0寄存器中,其中val_1是一个Label 

0

 

5 MIPS函数调用

5.1 基本栈帧结构

完整的栈帧结构具有5个部分:

la $t0, val_1    //复制val_1表示的地址到$t0寄存器中,其中val_1是一个Label 

1

局部数据存储段在填充段后面(栈底方向),是栈帧的最后一部分

5.2 简单叶子函数

简单叶子函数指的是不调用任何子函数,不访问任何堆栈上的内存空间的函数。

考虑如下C语言代码:

la $t0, val_1    //复制val_1表示的地址到$t0寄存器中,其中val_1是一个Label 

2

用汇编语言显示其调用过程如下:

la $t0, val_1    //复制val_1表示的地址到$t0寄存器中,其中val_1是一个Label 

3

5.3 带数据访问的叶子函数

带数据访问的叶子函数指的是访问栈空间但是不再调用子函数的函数。

考虑如下C语言代码:

la $t0, val_1    //复制val_1表示的地址到$t0寄存器中,其中val_1是一个Label 

4

用汇编语言显示其调用过程如下(假设计算过程中改变了$s0, $s1, $s3的值):

la $t0, val_1    //复制val_1表示的地址到$t0寄存器中,其中val_1是一个Label 

5

栈帧结构如下:

la $t0, val_1    //复制val_1表示的地址到$t0寄存器中,其中val_1是一个Label 

6

注意:如果函数在计算过程中并没有改变$s0,$s1,$s3的值,那么编译器就不会对其进行保存操作。

5.4 非叶子函数

非叶子函数指的是将会调用子函数的函数,这样的函数栈帧空间将具有所有栈帧节区属性。

考虑如下C语言代码:

la $t0, val_1    //复制val_1表示的地址到$t0寄存器中,其中val_1是一个Label 

7

用汇编语言显示其调用过程如下:

la $t0, val_1    //复制val_1表示的地址到$t0寄存器中,其中val_1是一个Label 

8

栈帧结构如下:

la $t0, val_1    //复制val_1表示的地址到$t0寄存器中,其中val_1是一个Label 

9

好啦,这次就写到这里,如果有什么疏漏欢迎大家批评,我会尽快修正的!


Notice: Undefined variable: canUpdate in /var/www/html/wordpress/wp-content/plugins/wp-autopost-pro/wp-autopost-function.php on line 51