MIPS指令学习二
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指令学习二的更多相关文章
- ARM指令学习,王明学learn
ARM指令学习 一.算数和逻辑指令 1— MOV 数据传送指令 2.— MVN 数据取反传送指令 3.— CMP 比较指令 4.— CMN 反值比较指令 5.— TST 位测试 ...
- SpringMVC入门学习(二)
SpringMVC入门学习(二) ssm框架 springMVC 在上一篇博客中,我简单介绍了一下SpringMVC的环境配置,和简单的使用,今天我们将进一步的学习下Springmvc的操作. mo ...
- 2017-2018-3 20155337《信息安全系统设计基础》 pwd指令学习
2017-2018-3 20155337<信息安全系统设计基础> pwd指令学习 任务要求 学习pwd指令 研究pwd实现需要的系统调用(man -k:grep),写出伪代码 实现mypw ...
- (转)MyBatis框架的学习(二)——MyBatis架构与入门
http://blog.csdn.net/yerenyuan_pku/article/details/71699515 MyBatis框架的架构 MyBatis框架的架构如下图: 下面作简要概述: S ...
- MIPS汇编学习
MIPS汇编学习 mips汇编不同于x86汇编,属于精简指令集,常见于路由器等一些嵌入式设备中. mips汇编没有对堆栈的直接操作,也就是没有push和pop指令,mips汇编中保留了32个通用寄存器 ...
- emberjs学习二(ember-data和localstorage_adapter)
emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...
- ReactJS入门学习二
ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...
- QtSpim实现MIPS指令的编写
QtSpim实现MIPS指令的编写 由于各种对齐问题,cnblogs的格式难以控制,故贴图片,谅解.
- TweenMax动画库学习(二)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
随机推荐
- MySQL-如何删除hash表分区
一个大表,之前是以hash分区表的形式存在的, MySQL> show create table history_uint; | history_uint | CREATE TABLE `his ...
- Python面向对象静态方法,类方法,属性方法
Python面向对象静态方法,类方法,属性方法 属性: 公有属性 (属于类,每个类一份) 普通属性 (属于对象,每个对象一份) 私有属性 (属于对象,跟普通属性相似,只是不能通过对象直接访问) 方法: ...
- Spring的 AOP底层用到两种代理机制
JDK 的动态代理:针对实现了接口的类产生代理.CGlib 的动态代理:针对没有实现接口的类产生代理,应用的是底层的字节码增强的技术 生成当前类的子类对象 JDK动态代理实现1. 创建接口和对应实现类 ...
- Harmonic Number (II) LightOJ - 1245 (找规律?。。。)
题意: 求前n项的n/i 的和 只取整数部分 暴力肯定超时...然后 ...现在的人真聪明...我真蠢 觉得还是别人的题意比较清晰 比如n=100的话,i=4时n/i等于25,i=5时n/i等于20 ...
- bzoj 3224: Tyvj 1728 普通平衡树 && loj 104 普通平衡树 (splay树)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 思路: splay树模板题: 推荐博客:https://blog.csdn.ne ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- 自学Zabbix12.4 Zabbix命令-zabbix_sender
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix12.4 Zabbix命令-zabbix_sender 1. zabbix_sen ...
- SharePoint 2013 APP 开发示例 (四)JQuery访问REST
这个示例里,我们将用JQuery AJAX去发送一个 REST请求,并查看返回结果.为了让我们更好地理解REST 接口,我们将添加一个输入框让用户可以指定REST的URL, 这将让我们尝试着用构造的U ...
- 洛谷 P1054 等价表达式 解题报告
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- JAVA多线程之中断机制(如何处理中断?)
一,介绍 这篇文章主要记录使用 interrupt() 方法中断线程,以及如何对InterruptedException进行处理.感觉对InterruptedException异常进行处理是一件谨慎且 ...