ARM基础 六、ARM指令集
来源:互联网 发布:快速傅里叶变换算法 编辑:程序博客网 时间:2024/05/16 10:59
1.分别为数据处理指令 (完成CPU内部的计算)
2. Load/Store指令 (完成CPU与内存 IO外设之间的数据传输)
3. 跳转指令 (完成程序的跳转)
4. 程序状态寄存器处理指令 (完成 CPSR的管理 )
5. 协处理器指令 (完成CPU扩展功能的实现)
6. 异常产生指令 (用户程序异常触发)
一、数据处理指令
1、数据传送指令MOV、MVN
MOV 指令格式 MOV{cond}{S} Rd,operand2
MVN 指令格式 MVN{cond}{S} Rd,operand2
2、算术运算指令ADD、SUB、ADC、RSB、SBC、RSC
ADD:加法运算指令 eg:ADD R1,R1,R2 ;R1=R1+R2
SUB :减法运算指令 eg:SUBS R2,R1,R2 ;R2=R1-R2
ADC:带进位加法指令 eg:(使用ADC实现64位加法,结果存于R1、R0中)
ADDS R0,R0,R2 ;R0等于低32位相加,并影响标志位
ADC R1,R1,R3 ;R1等于高32位相加,并加上低位进位
SBC:带进位减法指令 eg:(使用SBC实现64位减法,结果存于R1、R0中)
SUBS R0,R0,R2 ; 低32位相减,并影响标志位
SBC R1,R1,R3 ;高32位相减,并减去低位借位
RSB:逆向减法指令 eg: RSB R3,R1,#0xFF00 ;R3=0xFF00-R1
RSBS R1,R2,R2,LSL #2 ;R1=(R2<<2)-R2=R2×3
RSC:带进位逆向减法指令 eg: (使用RSC指令实现求64位数值的负数) RSBS R2,R0,#0 RSC R3,R1,#0
3、逻辑运算AND、ORR、EOR、BIC
AND : 逻辑与操作指令 eg: ANDS R0,R0,#0x01 ;R0=R0&0x01,取出最低位数据 AND R2,R1,R3 ;R2=R1&R3
ORR : 逻辑或操作指令 eg: ORR R0,R0,#0x0F ;将R0的低4位置1
MOV R1,R2,LSR #24 ;使用ORR指令将R2的高8位
ORR R3,R1,R3,LSL #8 ;数据移入到R3低8位中
EOR : 逻辑异或操作指令 eg: EOR R1,R1,#0x0F ;将R1的低4位取反 EOR R2,R1,R0 ;R2=R1^R0
EORS R0,R5,#0x01 ; 将R5和0x01进行逻辑异或 ;结果保存到R0,并影响标志位
BIC : 位清除指令 eg: BIC R1,R1,#0x0F ;将R1的低4位清零,其它位不变 BIC R1,R2,R3 ;将R3的反码和R2相逻辑“与”,结果保存到R1中
4、比较运算CMP、CMN、TST、TEQ
CMP:比较指令 eg: CMP R1,R2 ; R1与R2比较,设置相关标志位
注意:CMP指令与SUBS指令的区别在于CMP指令不保存运算结果。在进行两个数据的大小判断时,常用CMP指令及相应的条件码来操作
CMN:负数比较指令 eg: CMN R0,#1 ; R0+1,判断R0是否为1的补码,如果是,则设置Z标志位
注意:CMN指令与ADDS指令的区别在于CMN指令不保存运算结果。CMN指令可用于负数比较,比如CMN R0,#1指令则表示R0与-1比较,若R0为-1,则Z置位;否则Z复位
TST:位测试指令 eg: TST R0,#0x01 ; 判断R0的最低位是否为0 TST R1,#0x0F ; 判断R1的低4位是否为0
注意:TST指令与ANDS指令的区别在于TST指令不保存运算结果。
TST指令通常与EQ、NE条件码配合使用,当所有测试位均为0时,EQ有效,而只要有一个测试位不为0,则NE有效
TEQ:相等测试指令 eg: TEQ R0,R1 ; 比较R0与R1是否相等(不影响V位和C位)
注意:TEQ指令与EORS指令的区别在于TEQ指令不保存运算结果。使用TEQ进行相等测试时,常与EQ、NE条件码配合使用。当两个数据相等时,EQ有效;否则NE有效。
5、乘法指令
*数据处理指令机器码
二、Load/Store指令
Load/Store指令用于寄存器和内存间数据的传送。
Load用于把内存中的数据装载到寄存器中。Store用于把寄存器中的数据存入内存。
1、▲单一数据单一数据传送指令(LDR和STR等)
LDR:LDR{<cond>} <Rd>,<addr>;
把addr所表示的内存地址中的字数据装载到目标寄存器Rd中,同时还可以把合成的有效地址写回到基址寄存器。地址addr可以是一个简单的值、一个偏移量,或者是一个被移位的偏移量。
寻址方式: Rn:基址寄存器。 Rm:变址寄存器。 Index:偏移量,12位的无符号数。
LDR Rd,[Rn] ;把内存中地址为Rn的字数据装入寄存器Rd中
LDR Rd,[Rn,Rm] ;将内存中地址为Rn+Rm的字数据装入寄存器Rd中
LDR Rd,[Rn,#index] ;将内存中地址为Rn+index的字数据装入Rd中
LDR Rd,[Rn,Rm,LSL#5] ;将内存中地址为Rn+Rm×32的字数据装入Rd
LDR Rd,[Rn,Rm] ! ;将内存中地址为Rn+Rm的字数据装入Rd,并将新地址Rn+Rm写入Rn
LDR Rd,[Rn,#index] ! ;将内存中地址为Rn+index的字数据装入Rd,并将新地址Rn+index写入Rn
LDR Rd,[Rn,Rm,LSL#5] ;将内存中地址为Rn+Rm×32的字数据装入Rd,并将新地址Rn+Rm×32写入Rn
LDR Rd,[Rn],Rm ;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+Rm写入Rn
LDR Rd,[Rn],#index ;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+index写入Rn
LDR Rd,[Rn],Rm,LSL#5 ;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+Rm×32写入Rn
LDR R0,[R1,R2,LSL#5]! ; 将内存中地址为R1+R2×32的字数据装入寄存器R0,并将新地址R1+R2×32写入R1
STR:STR{<cond>} <Rd>,<addr>;
把寄存器Rd中的字数据(32位)保存到addr所表示的内存地址中,同时还可以把合成的有效地址写回到基址寄存器。地址addr可以是一个简单的值、一个偏移量,或者是一个被移位的偏移量。
寻址方式: Rn:基址寄存器。 Rm:变址寄存器。 Index:偏移量,12位的无符号数。
STR R0,[R1,#5]! ;把R0中的字数据保存到以R1+5为地址的内存中,然后R1=R1+5
2、▲多数据传送指令(LDM和STM)
LDM/STM:<LDM|STM>{<cond>}<addressing_mode> Rb{!}, <寄存器 list>
LDM / STM指令允许一次传送1到16个寄存器到/从存储器中。寄存器传送顺序是固定的,不能被改变。最小数字的寄存器总是被对应到存储器的最低地址上。
4 种寻址操作:
LDMIA / STMIA Increment After(先操作,后增加)
LDMIB / STMIB Increment Before(先增加,后操作)
LDMDA / STMDA Decrement After (先操作,后递减)
LDMDB / STMDB Decrement Before (先递减,后操作)
3、 * 数据交换指令(SWP和SWPB)
三、跳转指令(B、BL、BX、BXL)
B:分支指令 该指令跳转范围限制在当前指令的±32M字节地址内(ARM指令为字对齐,最低2位地址固定为0)。
eg:B WAITA ; 跳转到WAITA标号处 B 0x1234 ; 跳转到绝对地址0x1234处
BL:分支指令 BL指令适用于子程序调用,使用该指令后,下一条指令的地址被拷贝到R14(即LR) 连接寄存器中,然后跳转到指定地址运行程序。
跳转范围限制在当前指令的±32M字节地址内。
eg:BL DELAY ; 调用子函数DELAY
BX、BXL(略)
四、程序状态寄存器处理指令(PSR传送指令)
MRS:状态寄存器读指令
在ARM处理器中,只有MRS指令可以对状态寄存器CPSR和SPSR进行读操作。
通过读CPSR可以了解当前处理器的工作状态。读SPSR寄存器可了解到进异常前的处理器状态
eg: MRS R1 CPSR ; 将CPSR状态,寄存器读取保存到R1中 R1,,MRS R2,SPSR ; 将SPSR状态寄存器读取,保存到R2中
MSR: 状态寄存器写指令
在ARM处理器中,只有MSR指令可以对状态寄存器CPSR和SPSR进行写操作。
与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。
MSR指令格式1:MSR{cond} psr_fields, #immed_8r MSR指令格式2:MSR{cond} psr_fields, Rm
eg:
应用示例1(子程序:使能IRQ中断):
这四步的作用依次是1将CPSR内容读出到R0;2修改对应于CPSR中的 I 控制位;3将修改后的值写回CPSR的对应控制域;4返回上一层函数
五、协处理器指令*
六、异常产生指令SWI
参考博客:ARM 软中断指令SWI
补充1:指令格式中符号说明
1)条件执行及标志位
2)第二操作数
1>立即数 mov r0, #0x100 mov r2, #1
2>寄存器 mov r1, r0
3>寄存器移位立即数位 mov r1, r0, lsl #2
4>寄存器移位寄存器位 mov r1, r0, lsl r2
3)立即数
mov r0, #0x12345678 mov r0, #0xe0000001 mov r0, #0xFFFFFFFF mov r0, #0x00001f80
补充2:桶形移位器
补充3:Thumb指令集与ARM指令集的区别
Thumb指令集较ARM指令集有如下限制:
1)只有B指令可以条件执行,其它指令都不能条件执行;
2)分支指令的跳转范围有更多限制;
3)数据处理指令的操作结果必须放入其中一个;
4)单寄存器访问指令,只能操作R0~R7;
5)LDM和STM指令可以对R0~R7的任何子集进行操作;
资料:
ARM处理器指令系统三 数据处理指令总结
ARM指令集 和 条件执行 详解
ARM指令英文全称及功能
ARM基础指令练习题汇总
- ARM基础 六、ARM指令集
- ARM的六大类指令集
- ARM汇编指令基础
- ARM基础系列——ARM指令集
- ARM基础系列——ARM指令集
- ARM基础系列——ARM指令集
- ARM基础系列——ARM指令集
- ARM的六大类指令集--- 加载/存储指令
- ARM的六大类指令集---跳转指令
- ARM的六大类指令集---跳转指令
- ARM的六大类指令集--- 加载/存储指令
- ARM的六大类指令集--- 加载/存储指令
- ARM指令集基础复习 s3c2440
- ARM基础 三、计算机的指令集
- ARM基础:ARM指令之MSR
- ARM基础:ARM 伪指令详解
- ARM:ARM汇编语言与基础汇编指令
- arm基础汇编指令小结
- COGS 2123. [HZOI 2015] Glass Beads
- 基于CentOS6.6搭建LNMP服务器环境
- HDU1233 还是畅通工程 【最小生成树】
- Jenkins自动部署到Tomcat随机失败的问题
- 使用android studio中遇到的常见问题及解决方法
- ARM基础 六、ARM指令集
- Android 深入理解Android中的自定义属性(转载)
- 2706:麦森数
- 前端技能练习:span 标签的width 和 height
- 缓存更新策略
- codevs动态规划 选菜
- 对数组名取地址 a[ ],&a
- FORALL 之 SAVE EXCEPTIONS子句应用一例
- CodeBat Java Warmup-1