13 ARM指令集与Thumb指令集
指令格式
ARM基本格式
<opcode>{<cond>}{S}{.W|.N}<Rd>,<Rn>{,<operand2>}
opecode:指令助记符
cond:执行条件
|
助记符 |
标志 |
含义 |
|
EQ |
Z=1 |
相等 |
|
NE |
Z=0 |
不相等 |
|
CS/HS |
C=1 |
无符号数大于或等于 |
|
CC/LO |
C=0 |
无符号数小于 |
|
MI |
N=1 |
负数 |
|
PL |
N=0 |
正数或0 |
|
VS |
V=1 |
溢出 |
|
VC |
V=0 |
没有溢出 |
|
HI |
C=1,Z=0 |
无符号数大于 |
|
LS |
C=0,Z=1 |
无符号数小于或等于 |
|
GE |
N=V |
有符号数大于或等于 |
|
LT |
N!=V |
有符号数小于 |
|
GT |
Z=0,N=V |
有符号数大于 |
|
LE |
Z=1,N!=V |
有符号数小于或等于 |
|
AL |
任何 |
无条件执行(指令默认条件) |
S:指令是否影响CPSR寄存器
.W和.N:宽度说明符,默认16位,32位使用 .W说明符。ARM和Thumb都可以使用
1。跳转指令,4条
1。B跳转:B{cond} label
2。BL带链接跳转(类似单步步入)将当前指令下一条指令地址存入R14寄存器,常用来调用子程序:BL{cond} label
3。BX带状态切换跳转(在ARM与Thumb之间切换)处理器判断Rm的位[0]为1,是则将CPSR寄存器标志T置位,切换至Thumb,反之切换为ARM:RX{cond} Rm
4。BLX带链接和状态切换的跳转:BLX{cond} Rm
2。存储器访问指令:
LDR:寄存器←存储器
格式:LDR{type}{cond} Rd,label LDRD{cond} Rd,Rd2,label
Type取值:
B:无符号字节(加载时0扩展为32位)
SB:有符号字节(加载时符号扩展为32位)
H:无符号半字节(加载时0扩展为32位)
SH:有符号半字节(加载时符号扩展为32位)
Rd:加载寄存器
Label:读取的内存地址
LDRD:一次加载双字的数据
STR:寄存器→内存
STR{type}{cond} Rd,label
STRD{cond} Rd,Rd2,label
Type中的SB和HS对STR无效
LDM可以指定多个存储单元:寄存器←内存
LDM{addr_mode}{cond} Rn{!} reglist
addr_mode:
IA:Increase After,基址寄存器在执行指令后增加,默认
IB:Increase Before,基址寄存器在执行指令前增加(仅ARM)
DA:Decrease After,基址寄存器在执行指令后减少(仅ARM)
DB:Decrease Before,基址寄存器在执行指令之前减少
FD:满递减堆栈,堆栈向低地址生长,堆栈指针指向最后一个入栈的有效数据项
FA:满递增堆栈,堆栈向高地址生长,堆栈指针指向下一个要放入的空地址
ED:空递减堆栈,堆栈向低地址生长
EA:孔递增堆栈,堆栈向高地址生长
Rn:基地址寄存器,存储初始地址
!:可选后缀,有则最终地址将写回到Rn寄存器
reglist:存储数据的寄存器列表,多个连续寄存器可用“-”链接,不连续用“,”分隔
STM:寄存器列表数据→内存
STM{addr_mode}{cond} Rn{!} reglist
PUSH:将寄存器推入满递减堆栈
PUSH{cond} reglist
POP:从满递减堆栈弹出寄存器信息
POP{cond} reglist
SWP:寄存器←→内存
SWP{B}{cond} Rd,Rm,[Rn]
B:可选字节,有B则交换字节否则交换32位的字
cond:执行条件
Rd:从内存中加载数据的寄存器
Rm:写入数据的到内存的寄存器
Rn:需要交换数据的存储器地址。Rn不能与Rd和Rm相同
Eg:SWP R1,R1,[R0] 交换R1和R0
SWPB R1,R2,[R0] 将R0一字节给R1高位清0,R2给内存
3。数据处理指令:数据传输,算术运算,逻辑运算,比较4类。
数据处理指令是寄存器之间的数据操作,均可使用S后缀决定是否影响状态标志。
比较指令,不需要S后缀直接影响状态标志
MOV:将8位的立即数或寄存器内容传送到目标寄存器
MOV{cond} {S} Rd,operand2
MVN:将8位的立即数或寄存器内容按位取反传送到目标寄存器
MVN{cond}{S} Rd,operand2
ADD
ADD{cond}{S} Rd,Rn,operand2
ADC:带进位加法,将Rn寄存器与operand2值相加,再加上CPSR寄存器的C条件标志位的值,保存到Rn寄存器
ADC{cond}{S} Rd,Rn,operand2
SUB:Rn-operand2 减法
SUB{cond}{S} Rd,Rn,operand2
RSB:operand2-Rn 逆向减法
RSB{cond}{S} Rd,Rn,operand2
SBC:Rn-operand2-CPSR寄存器的C条件标志位的值
SBC{cond}{S} Rd,Rn,operand2
RSC:operand2-Rn-CPSR寄存器的C条件标志位的值
RSC{cond}{S} Rd,Rn,operand2
MUL:Rd=Rm*Rn
MUL{cond}{S} Rd,Rm,Rn
MLS:Rd=Ra-Rm*Rn
MLS{cond}{S} Rd,Rm,Rn,Ra
UMULL:将Rm*Rn的值分成RdHi=高32位,RdLo=低32位
UMULL{cond}{S} RdLo,RdHi,Rm,Rn
SMULL:将Rm*Rn的值作为无符号数分成RdHi=高32位,RdLo=低32位
SMULL{cond}{S} RdLo,RdHi,Rm,Rn
UMLAL:将Rm*Rn的值作为无符号数分成RdHi=高32位,RdLo=低32位,然后64位结果在于RdHi和RdLo相加
UMLAL{cond}{S} RdLo,RdHi,Rm,Rn
SMLAL:将Rm*Rn的值作为有符号数分成RdHi=高32位,RdLo=低32位,然后64位结果在于RdHi和RdLo相加,
SMLAL{cond}{S} RdLo,RdHi,Rm,Rn
SMLAD:Rd=Rm*Rn(都是低半字节)+Rm*Rn(都是高半字节)+Ra
SMLAD{cond}{S} Rd,Rm,Rn,Ra
SMLSD:Rd= Rm*Rn(都是低半字节)-Rm*Rn(都是高半字节)+Ra
SMLSD{cond}{S} Rd,Rm,Rn,Ra
SDIV:有符号除法
SDIV{cond} Rd,Rm,Rn
UDIV:无符号除法
UDIV{cond} Rd,Rm,Rn
ASR:算术右移
ASR{cond}{S} Rd,Rm,operand2
AND
AND{cond}{S} Rd,Rn,operand2
ORR
ORR{cond}{S} Rd,Rn,operand2
EOR
EOR{cond}{S} Rd,Rn,operand2
BIC:位清除指令,将operand2取反,与Rn值 与操作 结果保存到Rd
BIC {cond}{S} Rd,Rn,operand2
LSL:逻辑左移
LSL{cond}{S} Rd,Rm,operand2
LSR:逻辑右移
LSR{cond}{S} Rd,Rm,operand2
ROR:循环右移,移出的位回到左边
ROR{cond}{S} Rd,Rm,operand2
RRX:带扩展循环右移,Rm循环右移1位,寄存器最高位用标志为的值填充,结果存入Rd
RRX{cond}{S} Rd,Rm
CMP:Rn-operand2,根据结果设置标志位
CMP{cond} Rn,operand2
CMN:Rn+operand2,根据结果设置标志位
CMN{cond} Rn,operand2
TST:位测试指令,Rn与operand2与操作,根据结果设置标志位
TST{cond} Rn,operand2
TEQ:位测试指令,Rn与operand2异或操作,根据结果设置标志位
TEQ{cond} Rn,operand2
4。其他指令:
SWI:软件中断指令
SWI{cond},immed_24
Android系统中,系统调用为0号中断,R7寄存器存放系统调用号,R0~R3
传递系统调用前的4个参数,大于4个参数用堆栈调用
NOP:空指令
MRS:读状态寄存器指令
MRS Rd,psr psr取值可以是CPSR或SPSR
MSR写状态寄存器指令
MSR Rd,psr_fields,operand2
field指定传送区域(field所代表的字母必须小写):
c:控制域屏蔽字节(psr[7…0])
x:扩展域屏蔽字节(psr[15…8])
s:状态域屏蔽字节(psr[23…16])
f:标志域屏蔽字节(psr[31…24])
13 ARM指令集与Thumb指令集的更多相关文章
- 【基于Android的ARM汇编语言系列】之五:ARM指令集与Thumb指令集
作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell [ ...
- ARM指令集、Thumb指令集、Thumb-2指令集
MCU使用什么指令集主要由内核决定的,比如Cortex-M3使用的是Thumb-2指令集 ARM指令集: 编代码全部是 32bits 的,每条指令能承载更多的信息,因此使用最少的指令完成功能, 所以在 ...
- Thumb指令集与ARM指令集的差别
Thumb指令集 Thumb指令能够看做是ARM指令压缩形式的子集.是针对代码密度[1]的问题而提出的.它具有16为的代码密度.Thumb不是一个完整的体系结构,不能指望处理程序仅仅 ...
- ARM指令和Thumb指令区别
Thumb指令集 ]的问题而提出的,它具有16为的代码密度.Thumb不是一个完整的体系结构,不能指望处理程序只执行Thumb指令而不支持ARM指令集.因此,Thumb指令只需要支持通用功能,必要时, ...
- 【原/转】ios指令集以及基于指令集的app包压缩策略
iPhone指令集 本文所讲的内容都是围绕iPhone的CPU指令集(想了解ARM指令集的同学请点击这里),现在先说说不同型号的iPhone都使用的是什么指令集: ARMv8/ARM64 = iP ...
- ARM状态和THUMB状态
ARM处理器的工作状态 在ARM的体系结构中,可以工作在三种不同的状态,一是ARM状态,二是Thumb状态及Thumb-2状态,三是调试状态. <嵌入式系统开发与应用教程(第2版)>上介绍 ...
- ARM的六大类指令集---LDR、LDRB、LDRH、LDM、STR、STRB、STRH、STM
http://blog.csdn.net/u013477200/article/details/50723555
- ARM指令集(上)
ADuC702x可以用两套指令集:ARM指令集和Thumb指令集.本小节介绍ARM指令集.在介绍ARM指令集之前,先介绍指令的格式. A.2.1 指令格式 (1)基本格式 ...
- ARM 中必须明白的几个概念
文章具体介绍了关于ARM的22个常用概念. 1.ARM中一些常见英文缩写解释 MSB:最高有效位: LSB:最低有效位: AHB:先进的高性能总线: VPB:连接片内外设功能的VLSI外设总线: EM ...
随机推荐
- 每天一道Rust-LeetCode(2019-06-01)
每天一道Rust-LeetCode(2019-06-01) 坚持每天一道题,刷题学习Rust. 题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的, ...
- HBase快照迁移数据失败原因及解决办法
目录 目录 1 1. 背景 1 2. 环境 1 3. 执行语句 1 4. 问题描述 1 5. 错误信息 2 6. 问题原因 3 7. 解决办法 4 1. 背景 机房裁撤,需将源HBase集群的数据迁移 ...
- 笔记&想要置顶但懒得置顶的文章目录
1.\(\text{Markdown&Latex}\)学习笔记 2.一些笔记 3.好东西 4.线段树学习笔记 5.并查集学习笔记 6.友链 7.语录
- CF264D - Colorful Stones 题解
题面 官方题解 模拟赛题解 题解概述: 定义符号A~B表示序列A是序列B的子序列,A!~B反之. 设操作序列为I,则有A~I,B!~I,C~I,D!~I. 可得出条件①B!~C且D!~A,所以我们只要 ...
- vue CSS使用/deep/
比如你使用了别人的组件或者自己开发一个组件,有时候你修改一处就可能影响到别的地方,这个时候要么你不用别人的组件,自己重新封装一个,但很多时候是不太现实的,所以就需要有一个方法或者方式,既不影响到别的地 ...
- 删除list集合中某些数据
去除list集合中不符合条件的数据 List<DictVo> applyStateList = SingletonHoldResource.getInstance().getList(Fr ...
- 1-5docker私有镜像仓库
1.简单操作 1.在 https://cloud.docker.com 免费注册一个 Docker 账号 2.登录 docker login #命令登录 Docker Hub. 3.注销 docker ...
- 【Docker】涨姿势,深入了解Dockerfile 中的 COPY 与 ADD 命令
参考资料:https://www.cnblogs.com/sparkdev/p/9573248.html Dockerfile 中提供了两个非常相似的命令 COPY 和 ADD,本文尝试解释这两个命令 ...
- pip: failed to create process.解决方法
昨天在使用pip过程,pip提示:failed to create process. 解决方法:python -m pip install xxx 就可以了 如以matplotlib为例即:pytho ...
- ASP.NET Core使用Docker进行容器化托管和部署
一.课程介绍 人生苦短,我用.NET Core!今天给大家分享一下Asp.Net Core以Docker进行容器化部署托管,本课程并不是完完全全的零基础Docker入门教学,课程知识点难免有没覆盖全面 ...