1、MIPS寻址方式

MIPS架构的寻址模式有寄存器寻址、立即数寻址、寄存器相对寻址和PC相对寻址4种,其中寄存器相对寻址、PC相对寻址介绍如下:

1.1、寄存器相对寻址

这种寻址模式主要被加载/存储指令使用,其对一个16位的立即数进行符号扩展,然后与指定通用寄存器的值相加,从而得到有效地址。

通用寄存器GRP   +   16位立即数做符号扩展      =       有效地址

1.2、PC相对寻址

这种寻址模式主要被转移指令使用。在转移指令中有一个16位的立即数,将其左移2位并进行符号扩展,然后与程序计数器PC的值相加,可得到有效地址。

程序计数器PC     +      16位立即数左移2位并做符号扩展     =     有效地址

2、MIPS指令集

2.1、MIPS指令特点

MIPS固定4字节指令长度。

内存中的数据访问(load/store)必须严格对齐(至少4字节对齐)。

跳转指令只有26位目标地址,加上2位对齐位,可寻址28位寻址空间,即256MB。

条件分支指令只有16位跳转地址,加上2位对齐位,共18位寻址空间,即256KB。

MIPS默认不把子函数的返回地址(就是调用函数的受害指令地址)存放到栈中,而是存放到$31($ra)寄存器中,这对那些叶子函数(在函数中不再调用其他函数的函数)有利。如果遇到嵌套函数,有其他机制处理。

流水线效应。MIPS采用了高度的流水线,其中一个最重要的效应就是分支延迟效应。在分支跳转语句后面的那条语句叫做分支延迟槽。实际上,在程序执行到分支语句时,当它刚把要跳转到的地址填充好(填充到代码计数器里),还没有完成本条指令时,分支语句后面的那个指令就已经执行了,其原因就是流水线效应 ---- 几条指令同时执行,只是处于不同的阶段。

流水线效应:

mov $a0, $s2

jalr strrchr

move $a0, $s0

在执行第2行跳转分支时,第3行的move指令已经执行完了。因此,在上面指令序列中,strrchr函数的参数来自第3行的$s0,而不是第1行的$s2。

从流水线效应中可以看出,是否正确理解MIPS指令的这些特点会直接影响我们对MIPS程序逆向分析的结果,因此,我们需要熟悉把握这些特点。

2.2、指令格式

所有MIPS指令的长度相同,都是32位。为了让指令的格式刚好合适,设计者做了折中:将所有指令定长,但是不同的指令有不同的格式。在MIPS架构中,指令的最高6位均为Opcode码,剩下的26位可以将指令分为3种类型,分别为R型、I型和J型。

R型指令用连续3个5位二进制码表示3个寄存器的地址,然后用1个5位二进制码表示移位的位数(如果未使用移位操作,则全为0),最后是6位的Function码(它与Opcode码共同决定R型指令的具体操作方式)。

I型指令则用连续2个5位二进制码表示2个寄存器的地址,然后是由1个16位二进制码表示1个立即数二进制码。

J型指令用26位二进制码表示跳转目标的指令地址(实际的指令地址应为32位,其中最低2位为“00”,最高4位由PC当前地址决定)。

类型

格式

R

Opcode(6)

Rs(5)

Rt(5)

Rd(5)

Shamt(5)

Funct(6)

I

Opcode(6)

Rs(5)

Rt(5)

Immediate(16)

J

Opcode(6)

Address(26)

Opcode: 指令基本操作,称为操作码。

Rs: 第一个源操作数寄存器。

Rt: 第二个源操作数寄存器。

Rd: 存放操作结果的目的操作数。

Shamt: 位移量。

Funct: 函数,这个字段选择Opcode操作某个特定变体。

3、汇编常用的指令

注意:$Rd表示目的寄存器, $Rs表示源寄存器,$Rt表示作为中间缓存的寄存器,"imm"表示立即数,“MEM[]“表示RAM中的一段内存,“offset"表示偏移量。

3.1、LOAD/STORE指令

LOAD/STORE指令有14条,分别是lb、lbu、lh、lhu、ll、lw、lwl、lwr、sb、sc、sh、sw、swl和swr。

以"l"开头的都是加载指令,以"s"开头的都是存储指令,这些指令用于从存储器中读取数据,或者将数据保存在存储器中。

3.1.1、LA(Load Address) 指令用于将一个地址或标签存入一个寄存器。

语法

实例

备注

la $Rd, Label

la $t0, val_1

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

3.1.2、LI(Load Immediate)指令用于将一个立即数存入一个通用寄存器。

语法

实例

备注

lw $Rt, offset($Rs)

lw $s0, 0($sp)

"$s0 = MEM[$sp+0]",相当于取堆栈地址偏移0内存word长度的值到$s0中

3.1.3、LW(Load Word) 指令用于从一个指定的地址加载一个word类型的值到一个寄存器中。

语法

实例

备注

lw $Rt, offset($Rs)

lw $s0, 0($sp)

"$s0=MEM[$sp+0];",相当于取堆栈地址偏移0内存word长度的值到$s0中

3.1.4、SW(Store Word)用于将源寄存器中的值存入指定的地址。

语法

实例

备注

sw $Rt, offset($Rs)

sw $a0,0($sp)

"MEM[$sp+0]=$a0;",相当于将$a0寄存器中一个word大小的值存入堆栈,且$sp自动堆栈

3.1.5、MOVE指令用于寄存器之间值的传递。

语法

实例

备注

move $Rt, $Rs

move $t5, $t1

$t5=$t1;

3.2、算术运算指令

MIPS汇编指令的算术运算特点如下:

算术运算指令的所有操作数都是寄存器,不能直接使用RAM地址或间接寻址。

操作数大小都为word(4 Byte)。

算术运算指令有21条,分别为add、addi、sub、subu、clo、clz、slt、slti、sltiu、sltu、mul、mult、madd、maddu、msub、msubu、div和divu,实现了加、减、比较、乘、乘累加、除等运算。

指令格式与实例

注释

add $t0,$t1,$t2

"$t0=$t1+$t2;",带符号数相加

sub $t0,$t1,$t2

"$t0=$t2 - $t2;", 带符号数相减

addi $t0,$t1,5

$t0 = $t1 + 5;

addu $t0,$t1,$t2

"$t0 = $t1 + $t2;",无符号数相加

subu $t0, $t1, $t2

"$t0 = $t2 - $t2;",无符号数相减

mult $t3, $t4

"$t3 * $t4", 把64 Bits的积存储到"Lo,Hi"中,即"(Hi,Lo)=$t3 * $t4;"

div $t5, $t6

"$LO=$t5/$t6", $LO为商的整数部分;"$HI=$t5 mod $t6", $HI为余数

mfhi $t0

$t0 = $HI

mflo $t1

$t1 = $LO

mips中的li_MIPS指令学习二相关推荐

  1. mips中的li_MIPS学习笔记(一)

    写在前面 本文是根据"MIPS Assembly Language Programming CS50 Discussion and Project Book. Daniel J. Ellar ...

  2. 中科院张家俊:ChatGPT中的提示与指令学习

    内容来源:ChatGPT 及大模型专题研讨会 分享嘉宾:中国科学院自动化研究所研究员 张家俊 分享主题:<ChatGPT中的提示与指令学习> 中国科学院自动化研究所研究员张家俊以ChatG ...

  3. Nginx核心模块——HTTP中的配置指令location和rewrite介绍

    文章目录 一.正则表达式在学习 1.1 常用的Nginx 正则表达式 二.访问路由location 2.1 location的分类 2.2 location 常用的匹配规则: 2.3 location ...

  4. Docker学习二:Docker镜像与容器

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  5. 深度学习二(Pytorch物体检测实战)

    深度学习二(Pytorch物体检测实战) 文章目录 深度学习二(Pytorch物体检测实战) 1.PyTorch基础 1.1.基本数据结构:Tensor 1.1.1.Tensor数据类型 1.1.2. ...

  6. (转)MyBatis框架的学习(二)——MyBatis架构与入门

    http://blog.csdn.net/yerenyuan_pku/article/details/71699515 MyBatis框架的架构 MyBatis框架的架构如下图:  下面作简要概述: ...

  7. 计算机各个部件配合完成加减乘除(计组学习二)

    大家好,我是贺贺. 计算机组成原理系列 计算机的五大组成部分(计组学习一) 计算机各个部件配合完成加减乘除(计组学习二) 预热一下 当我们了解了计算机的五大组成部分后,下面我来聊聊计算机的各个部件是怎 ...

  8. EFR32--如何在EFR32BG22透传中添加AT指令控制

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/MemsanGZmInG/article ...

  9. CMakeLists学习二、链接库搜索路径与ld

    CMakeLists学习二.链接库搜索路径与ld 前言 gcc的链接 gcc链接命令 ld搜索路径 ldconfig刷新动态库缓存 CMakeLists指定链接搜索路径 后记 前言 本文继续CMake ...

最新文章

  1. 关于Map的key值的问题
  2. ( 1 )Linux 常用命令
  3. SAP Spartacus Customizing Meta Tags
  4. SpringBoot集成Spring Security(一)登录注销
  5. [Python]网络爬虫(11):亮剑!爬虫框架小抓抓Scrapy闪亮登场!
  6. Postgresql使用coalesce实现类似oracle的NVL方法
  7. 基于iOS 10、realm封装的下载器
  8. 福州:物联网产业加速集聚 每年安排不低于1000万元专项资金
  9. ‮女的样么什‬人赚不到钱?͏
  10. 实现弹出窗口并转到另一个页面
  11. WCF学习之旅----基础篇之EnterpriseServices
  12. Linux脚本(1)__批量下载
  13. 蓝桥杯 ADV-184 算法提高 素数求和
  14. html捉虫游戏,街机游戏
  15. 组队开发第二周第五次会议
  16. 微信小程序选项卡原理
  17. 利用模版元编程将传统冒泡排序性能提升两倍以上
  18. centos7 安装搜狗拼音输入法
  19. 数据库原理与应用~第三版课后习题答案(何玉洁 编著)
  20. Msql特定业务之自增业务表,适用于根据表去分类管理业务数据

热门文章

  1. GWAS分析中SNP解释百分比PVE | 第一篇,SNP解释百分比之和为何大于1?
  2. 2023算法岗秋招笔试面试记录
  3. 7-9 目录树 (30分)
  4. 拜耳集全球创新服务中国农业,积极构建粮食系统韧性
  5. python中字符型用什么表示_「小白学Python」Python中最常用的数据类型:字符串
  6. 计算机组成原理名词解释
  7. Nginx 虚拟主机配置
  8. 过滤器实现自动登录(过滤器filter)
  9. node爬虫,抓取网页数据
  10. 【2023 年第三届长三角高校数学建模竞赛】B 题 长三角新能源汽车发展与双碳关系研究 新能源汽车销售相关数据160M+下载