七、ARM 指令集
7.1 数据处理指令
7.1.1 数据传送类
- MOV 类指令:核内寄存器间的数据传送
- 加载和存储指令(L/S):核内寄存器与挂在存储器总线上器件的数据传送
- 注意:
- 核内寄存器就是 R0-R15
- 外设寄存器入 GPIO 的寄存器
7.1.2 算术逻辑运算类
- ADD:假发指令
- MOV R0,#0x01
- ADD R0,R0.#0x01
- SUB:减法指令
- MUL:乘法指令
- AND:按位与指令
- ORR:按位或指令
- EOR:按位异或指令
- BIC:清零指令
- BIC R1,R1,#0x0f
- 最低 4 位清零
- 注意:ARM 指令集中没有除法指令,通过软件(移位-比较-相减)实现,不过在 ARMV7 指令集中增加了除法指令
7.1.3 比较指令
- CMP:比较两个数,会影响标志位
- TST:测试某一位是否为0,常与 EQ, NE 等条件码结合使用
- TEQ:判断两个数的位值是否相等,与 EQ, NE 条件码结合使用
- 注意:它们不需要加后缀 S,它们会直接影响程序状态寄存器,常用于选择/循环结构
7.2 跳转指令
- B:直接跳到要执行的指令处
- BL:待返回的跳转指令,相当于 C 语言的函数调用
- BX:改变状态的跳转,把 RN 的值赋值给 R15(PC),然后改变 CPSR 的 T位, T 位由 RN 里面的最低为即 bit 0 决定
- Rn[0] = 1, THUMB 状态(在原有的 Rn 上加 1 即可)
- Rn[0] = 0,ARM 状态
- BX R0 跳到 R0 地址处
- 1110 0001 0010 1111 1111 1111 0001 0000
- BLX:带返回的改变状态的跳转
7.3 协处理指令
- 协处理器是协助主 CPU 完成一些特定功能(MMU、Cache 和 TLB 等等)的处理器
- 功能上和操作系统的虚拟地址映射、Cache 管理等有关。
- 主要的指令有三类
- 数据操作指令:ARM 处理器通过 CDP 命令通知协处理器完成一些初始化操作,命令的解析由协处理器完成
- 存储器数据传送指令:ARM 处理器通过 LDC/STC 指令将内存单元的数据读取或者写入到协处理器的寄存器中
- 寄存器数据传送指令:ARM 处理器通过 MCR/MRC 指令将 ARM 处理器中的寄存器数据与协处理器中的寄存器数据进行数据传送
- 协处理器有 16 个,一般 CP15 是设置 MMU, Cache, 大小端等关于存储器配置的。
- CP15 包含 16 个 32 位寄存器, C0 - C15
- MCR{cond} coproc, opcode1, Rd, CRn, CRm, opcode2
- MRC{cond} coproc, opcode1, Rd, CRn, CRm, opcode2
- coproc:指令操作的协处理器名,标准名为 pn, n 为 0 ~ 15
- opcode1:协处理器的特定操作码,对于 CP15 寄存器来说, opcode 永远为0,不为 0 时,操作不可预知
- Rd:CPU 的寄存器
- CRn:存放第一个操作数的协处理器寄存器
- CRm:存放第二个操作数的协处理器,用来区分同一个编号的不同物理寄存器,当不需要提供附加信息时,指定为 C0
- opcode2:可选的协处理器操作码,用来区分同一个编号的不同物理寄存器,当不需要提供附加信息时,指定为 0
7.4 杂项指令
7.4.1 软中断
- SWI:软中断,一般用于系统调用,有两种方式完成:
- 方式一:
- MOV R0, #0x01 设置子功能为 0x01
- SWI 0x12 调用 0x12 软中断
- 方式二:
- MOV R0, #0x12
- MOV R1, #0x01
- SWI 0x00 产生中断,模式变成 SVC,跳到中断向量位置去
- 方式一:
7.4.2 寄存器与 PSR 数据传送
- 指令:MRS 和 MSR
- PSR 的控制域(fsxc):
- 位【31:24】位条件标志位域,用 f 表示;
- 位【23:16】为状态位域,用 s 表示;
- 位【15:8】为扩展位域,用 x 表示;
- 位【7:0】位控制位域,用 c 表示
- mrc r0, cpsr 将 cpsr 的值存入到 r0 中
- msr cpsr_c, #0xd3 将立即数 0xd3 放入到 cpsr 的 C 控制域中
7.5 伪指令
- 伪指令不是 ARM 指令,但可以把它当作指令来使用,主要作用是方便编写程序,最终还是会转换成 ARM 指令
- LDR R0,=0x12345678 ;绝对地址
- ADR R0,xxx(地址标号) ;相对地址
- ADRL R0, xxx(地址标号) ;相对地址
- NOP ;MOV R0, R0
- 区分:
- adr r0, _start ;取运行地址
- ldr r1, _start ;取得运行地址中的值(指令)
- ldr r2, = start ;取的是链接地址
七、ARM 指令集的更多相关文章
- ARM指令集学习总结-转载
ARM指令集比较简单,本文介绍ARM指令集中需要注意和不易理解的地方. 一.ARM指令集是32位的,程序的启动都是从ARM指令集开始,包括所有异常中断都是自动转化为ARM状态,并且所有的指 ...
- ARM_Instruction_Set_Encoding_hacking(ARM指令集编码格式解读)
ARM指令集编码格式解读 说明: 1.本文参考的书籍<ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition>中的Cha ...
- ARM指令集(上)
ADuC702x可以用两套指令集:ARM指令集和Thumb指令集.本小节介绍ARM指令集.在介绍ARM指令集之前,先介绍指令的格式. A.2.1 指令格式 (1)基本格式 ...
- ARM指令集相关知识
1.ARMv8引入了执行状态机制,分为AArch32和AArch64 AArch32为T32(Thumb)和A32(ARM). AArch64为A64一种指令集 A64和A32的指令都是32位宽,可以 ...
- ARM指令集----杂项指令
ARM指令集可以分为6类,即是跳转指令,数据处理指令,程序状态传输指令,Load.Store指令,协处理器指令和异常中断指令 跳转指令: 在ARM中有两种方式可以实现程序的跳转,一种是跳转指令,另一种 ...
- ARM指令集----寻址方式
ARM指令集可以分为跳转指令,数据处理指令,程序状态寄存器传输指令,LOAD/Store指令,协处理器指令和异常中断产生指令6类 ARM指令集的寻址方式 数据处理指令的操作数的寻址方式 字以及无符号字 ...
- ARM指令集——条件执行、内存操作指令、跳转指令
ARM 汇编指令条件执行 在ARM模式下,任何一条数据处理指令可以选择是否根据操作的结果来更新CPSR寄存器中的ALU状态标志位.在数据处理指令中使用S后缀来实现该功能. 不要在CMP,CMN,TST ...
- 对arm指令集的疑惑,静态库运行,编译报错等问题
转载自http://www.jianshu.com/p/4a70aa03a4ea?utm_campaign=hugo&utm_medium=reader_share&utm_conte ...
- 从最简单的实例学习ARM 指令集(三)
上一篇讲到赋值运算,这篇讲讲子函数调用.先看最简单范例:test4.c #include <stdio.h> void f1() { } void main() { int d = 4; ...
- ARM指令集—SWP指令
ARM指令集-SWP指令 SWP和SWPB是ARM指令集中对存储单元的原子操作.即对存储单元的一次读和一次不可被切割. SWP和SWPB分别完毕存储器和寄存器之间 一个字(32bit)和一个字节(8b ...
随机推荐
- 洛谷P1190 接水问题
题目名称:接水问题 题目来源 [洛谷P1190] (https://www.luogu.org/problemnew/show/P1190) 题目描述 学校里有一个水房,水房里一共有\(m\)个龙头 ...
- leetcode 4寻找两个有序数组的中位数
最优解O(log(min(m,n))) /** 之前用合并有序数组的思想做了O((m+n+1)/2),现在试一试O(log(min(m,n))) 基本思路为:通过二分查找较小的数组得到对应的中位数(假 ...
- 前端必须掌握的 docker 技能(3)
概述 作为一个前端,我觉得必须要学会使用 docker 干下面几件事: 部署前端应用 部署 nginx 给部署的 nginx 加上 https 使用 docker compose 进行部署 给 ngi ...
- delphi DLL image 动态绘图 句柄处理
在调用DLL 动态在T Image 绘图时,传入 Image.Canvas.Handle 后,却总是绘不上,有时偶尔能绘上,却没搞清原因,而同样的代码,传入窗体的 Handle ,绘图却正常. 经过 ...
- allure2生成html报告
前言 allure是一个report框架,支持java的Junit/testng等框架,当然也可以支持python的pytest框架,也可以集成到Jenkins上展示高大上的报告界面. 环境准备 1. ...
- Selenium学习之==>常见面试题
转自:http://www.imdsx.cn/ 一.selenium中如何判断元素是否存在? expected_conditions模块提供了多种校验方式,我常用的一种是presence_of_ele ...
- TiDB配置HAProxy负载均衡
1.简介 HAProxy是一个C语言编写的免费的负载均衡软件,可以运行于大部分主流的Linux操作系统上. HAProxy提供了L4(TCP)和L7(HTTP)两种负载均衡能力,具备丰富的功能. 2. ...
- 数据结构系列之2-3-4树的插入、查找、删除和遍历完整版源代码实现与分析(dart语言实现)
本文属于原创,转载请注明来源. 在上一篇博文中,详细介绍了2-3树的操作(具体地址:https://www.cnblogs.com/outerspace/p/10861488.html),那么对于更多 ...
- Mac020--常用插件
Google浏览器常用插件 1.github插件octotree 2.掘金Chrome网上应用商店 2-1.掘金/老司机的神兵利器 2-2.好用的Google插件:来自掘金 3.Gliffy Diag ...
- linux sed 命令 实现对文件的增删改替换查 实验
1. 统一实验文本 # 创建包含下面内容的文件,后面的操作都会使用这个文件 [root@MongoDB ~]# cat person.txt ,mike,CEO ,jack,CTO ,yy,CFO , ...