OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4123|回复: 1

ARM指令集-59个指令信息分析

[复制链接]

80

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
406
金钱
406
注册时间
2018-11-20
在线时间
25 小时
发表于 2018-12-20 14:42:11 | 显示全部楼层 |阅读模式
本帖最后由 打板子 于 2018-12-20 14:43 编辑

1.跳转指令
通过直接向PC寄存器中写入目标地址值可以实现在4GB地址空间中任意跳转,这种跳转指令又称为长跳转。如果在长跳转指令之前使用MOV LR,PC等指令,则可以保存将来返回的地址值,这样就实现了在4GB地址空间中的子程序调用。
在ARM版本5及以上的体系中,实现了ARM指令集和Thumb指令集的混合使用。指令使用目标地址值的bit[0]来确定目标程序的类型。bit[0]的值为1时,目标程序为Thumb指令;bit[0]值为0时,目标程序为ARM指令。
在ARM版本5以前的体系中,传送到PC寄存器中的目标地址值的低两位bits[1∶0]被忽略,跳转指令只能在ARM指令集中执行,即程序不能从ARM状态切换到Thumb状态。非T系列ARM版本5体系不含Thumb指令,当程序试图切换到Thumb状态时,将产生未定义指令异常中断。
ARM跳转指令可以从当前指令向前或向后的32MB地址空间跳转。这类跳转指令有以下4种。
(1)B 跳转指令
B〔条件) (地址)
B指令属于ARM指令集,是最简单的分支指令。一旦遇到一个B指令,ARM处理器将立即跳转到给定的地址,从那里继续执行。注意:存储在分支指令中的实际值是相对当前R15的值的一个偏移量,而不是一个绝对地址。它的值由汇编器来计算,是24位有符号数,左移两位后有符号扩展为32位,表示的有效偏移位为26位(+/- 32 MB)。
(2)BL 带返回的跳转指令
BI,〔条件) (地址)
BL指令也属于ARM指令集,是另一个分支指令。就在分支之前,在寄存器R14中装载上R15的内容,因此可以重新装载R14到R15中来返回到这个分支之后的那个指令处执行,它是子例程的一个基本但强力的实现。
(3)BLX 带返回和状态切换的跳转指令
BLX <地址>
BLX指令有两种格式,第1种格式的BLX指令记作BLX(1)。BLX(1)从ARM指令集跳转到指令中指定的目标地址,并将程序状态切换到Thumb状态,该指令同时将PC寄存器的内容复制到LR寄存器中。
BLX(1)指令属于无条件执行的指令。
第2种格式的BLX指令记作BLX(2)。BLX(2)指令从ARM指令集跳转到指令中指定的目标地址,目标地址的指令可以是ARM指令,也可以是Thumb指令。目标地址放在指令中的寄存器<dest>中,该地址的bit[0]值为0,目标地址处的指令类型由CPSR中的T位决定。该指令同时将PC寄存器的内容复制到LR寄存器中。
(4)BX 带状态切换的跳转指令
BX(条件) (dest)
BX指令跳转到指令中指定的目标地址,目标地址处的指令可以是ARM指令,也可以是Thumb指令。目标地址值为指令的值和0xFFFFFFFE做“与”操作的结果,目标地址处的指令类型由寄存器决定。

ADC
带进位的32位数加法
ADD
32位数相加
AND
32位数的逻辑与
B
在32M空间内的相对跳转指令
BEQ
相等则跳转(Branch if EQual)
BNE
不相等则跳转(Branch if Not Equal)
BGE
大于或等于跳转(Branch if Greater than or Equa)
BGT
大于跳转(Branch if Greater Than)
BIC
32位数的逻辑位清零
BKPT
断点指令
BL
带链接的相对跳转指令
BLE
小于或等于跳转(Branch if Less than or Equal)
BLEQ
带链接等于跳转(Branch with Link if EQual)
BLLT
带链接小于跳转(Branch with Link if Less Than)
BLT
小于跳转(Branch if Less Than)
BLX
带链接的切换跳转
BX
切换跳转
CDP CDP2
协处理器数据处理操作
CLZ
零计数
CMN
比较两个数的相反数
CMP
32位数比较
EOR
32位逻辑异或
LDC LDC2
从协处理器取一个或多个32位值
LDM
从内存送多个32位字到ARM寄存器
LDR
从虚拟地址取一个单个的32位值
MCR MCR2 MCRR
从寄存器送数据到协处理器
MLA
32位乘累加
MOV
传送一个32位数到寄存器
MRC MRC2 MRRC
从协处理器传送数据到寄存器
MRS
把状态寄存器的值送到通用寄存器
MSR
把通用寄存器的值传送到状态寄存器
MUL
32位乘
MVN
把一个32位数的逻辑“非”送到寄存器
ORR
32位逻辑或
PLD
预装载提示指令
QADD
有符号32位饱和加
QDADD
有符号双32位饱和加
QSUB
有符号32位饱和减
QDSUB
有符号双32位饱和减
RSB
逆向32位减法
RSC
带进位的逆向32法减法
SBC
带进位的32位减法
SMLAxy
有符号乘累加(16位*16位)+32位=32位
SMLAL
64位有符号乘累加((32位*32位)+64位=64位)
SMALxy
64位有符号乘累加((32位*32位)+64位=64位)
SMLAWy
号乘累加((32位*16位)>>16位)+32位=32位
SMULL
64位有符号乘累加(32位*32位)=64位
SMULxy
有符号乘(16位*16位=32位)
SMULWy
有符号乘(32位*16位>>16位=32位)
STC STC2
从协处理器中把一个或多个32位值存到内存
STM
把多个32位的寄存器值存放到内存
STR
把寄存器的值存到一个内存的虚地址内间
SUB
32位减法
SWI
软中断
SWP
把一个字或者一个字节和一个寄存器值交换
TEQ
等值测试
TST
位测试
UMLAL
64位无符号乘累加((32位*32位)+64位=64位)
UMULL
64位无符号乘累加(32位*32位)=64位


ARM指令集视频资料
http://www.makeru.com.cn/live/1758_324.html?s=45051
arm资料群 716101708
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

109

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2019-1-29
在线时间
4 小时
发表于 2019-3-8 15:09:57 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 18:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表