ARM指令集--相关指令的功能
文章目录
- ARM指令集的分类
- 数据处理指令(22种)
- 1. **MOV数据传送指令**
- 2. **数据取反传送指令 (Move Negative)**
- 3. **ADD 加法指令(Addition)**
- 4. **ADC 带进位加法指令(Addition with Carry)**
- 5. **SUB 减法指令(Subtraction)**
- 6. **RSB 减法指令(Reverse Subtraction)**
- 7. **SBC 带借位减法指令(Subtraction with Carry)**
- 8. **RSC 带借位的反向减法指令(Reverse Subtraction with Carry)**
- 9. **MUL 32位乘法指令(Multiplication)**
- 10. **MLA 32位乘加指令(Multiplication with Accumulate)**
- 11. **SMULL 64位有符号数乘法指令(Signed Multiply Long)**
- 12. **SMLAL 64位有符号数乘加指令(Signed Multiply-accumulate Long)**
- 13. **UMULL 64位无符号数乘法指令(Unsigned Multiply Long)**
- 14. **UMLAL 64位无符号数乘加指令(Unsigned Multiply-accumulate Long)**
- 15. **AND 逻辑与指令(Logical AND)**
- 16. **ORR 逻辑或指令(Logical OR)**
- 17. **EOR 逻辑异或指令(Logical Exclusive OR)**
- 18. **BIC 位清除指令(Bit Clear)**
- 19. **CMP 比较指令(Compare)**
- 20. **CMN 反值比较指令(Compare Negative)**
- 21. **TST 位测试指令(Test bits)**
- 22. **TEQ 相等测试指令(Test Equivalence)**
- 跳转指令(4种)
- 1. **B 跳转指令(Branch)**
- 2. **BL 带返回的跳转指令(Branch with Link)**
- 3. **BLX 带返回和状态切换的跳转指令(Branch,Link and Exchange)**
- 4. **BX 带状态切换的跳转指令(Branch and Exchange)**
ARM指令集的分类
ARM指令集共有6种类型(53种主要助记符):
数据处理指令(22种主要助记符)
跳转指令(4种主要助记符)
Load/Store指令(16种主要助记符)
程序状态寄存器指令(2种主要助记符)
协处理器指令(5种主要助记符)
软件中断指令 (2种主要助记符)
数据处理指令(22种)
1. MOV数据传送指令
格式:MOV{<cond>}{S} <Rd>,<op1>;
功能:Rd=op1
op1可以是寄存器、被移位的寄存器或立即数。
例如:
MOV R0,#5 ;R0=5
MOV R0,R1 ;R0=R1
MOV R0,R1,LSL#5 ;R0=R1左移5位
2. 数据取反传送指令 (Move Negative)
格式:MVN{<cond>}{S} <Rd>,<op1>;
功能:将op1表示的值传送到目的寄存器Rd中,但该值在传送前被按位取反,这是逻辑非操作而不是算术操作,这个取反的值加1才是其取负的值,即Rd=!op1;
op1可以是寄存器、被移位的寄存器或立即数。
例如:
MVN R0,#0 ;R0=-1
3. ADD 加法指令(Addition)
格式:ADD{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn+op2
op2可以是寄存器,被移位的寄存器或立即数。加法可以在有符号和无符号数上进行。
例如:
ADD R0,R1,#5 ;R0=R1+5
ADD R0,R1,R2 ;R0=R1+R2
ADD R0,R1,R2,LSL#5 ;R0=R1+R2左移5位
4. ADC 带进位加法指令(Addition with Carry)
格式:ADC{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn+op2+carry
op2可以是寄存器、被移位的寄存器或立即数;carry为进位标志值。该指令用于实现超过32位的数的加法。
例如:
第一个64位操作数存放在寄存器R2,R3中;
第二个64位操作数存放在寄存器R4,R5中;
64位结果存放在R0,R1中。
64位的加法可由以下语句实现:
ADDS R0,R2,R4 ;低32位相加,S表示结果影响条件标志位的值
ADC R1,R3,R5 ;高32位相加
5. SUB 减法指令(Subtraction)
格式:SUB{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn-op2
op2可以是寄存器、被移位的寄存器或立即数。
例如:
SUB R0,R1,#5 ;R0=R1-5
SUB R0,R1,R2 ;R0=R1-R2
SUB R0,R1,R2,LSL#5 ;R0=R1-R2左移5位
6. RSB 减法指令(Reverse Subtraction)
格式:RSB{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:同SUB指令,但倒换了两操作数的前后位置,即Rd=op2-Rn。
例如:
RSB R0,R1,#5 ;R0=5-R1
RSB R0,R1,R2 ;R0=R2-R1
RSB R0,R1,R2,LSL#5 ;R0=R2左移5位-R1
7. SBC 带借位减法指令(Subtraction with Carry)
格式:SBC{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn-op2-!carry
op2可以是寄存器、被移位的寄存器或立即数。
SUB和SBC生成进位标志的方式不同于常规,如果需要借位则清除进位标志,所以指令要对进位标志进行一个非操作。
例如:
第一个64位操作数存放在寄存器R2,R3中;
第二个64位操作数存放在寄存器R4,R5中;
64位结果存放在R0,R1中。
64位的减法(第一个操作数减去第二个操作数)可由以下语句实现:
SUBS R0,R2,R4; 低32位相减,S表示结果影响条件标志位的值
SBC R1,R3,R5; 高32位相减
8. RSC 带借位的反向减法指令(Reverse Subtraction with Carry)
格式:RSC{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:同SBC指令,但倒换了两操作数的前后位置,即Rd=op2-Rn-!carry。
例如:
前提条件与SBC例子相同,操作数1-操作数2的实现语句需改为:
SUBS R0,R2,R4; 低32位相减,S表示结果影响寄存器CPSR的值
RSC R1,R5,R3; 高32位相减
9. MUL 32位乘法指令(Multiplication)
格式:MUL{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn×op2
该指令根据S标志,决定操作是否影响CPSR的值;其中op2必须为寄存器。Rn和op2的值为32位的有符号数或无符号数。
例如:
MULS R0,R1,R2 ;R0=R1×R2,结果影响寄存器CPSR的值
10. MLA 32位乘加指令(Multiplication with Accumulate)
格式:MLA{<cond>}{S} <Rd>,<Rn>,<op2><op3>;
功能:Rd=Rn×op2+op3
op2和op3必须为寄存器。Rn、op2和op3的值为32位的有符号数或无符号数。
例如:
MLA R0,R1,R2,R3 ;R0=R1×R2+R3
11. SMULL 64位有符号数乘法指令(Signed Multiply Long)
格式:
SMULL{<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>;
功能:Rdh Rdl=Rn×op2
Rdh、Rdl和op2均为寄存器。Rn和op2的值为32位的有符号数。
例如:
SMULL R0,R1,R2,R3
;R0=R2×R3的低32位
;R1=R2×R3的高32位
12. SMLAL 64位有符号数乘加指令(Signed Multiply-accumulate Long)
格式:
SMLAL{<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>;
功能:Rdh Rdl=Rn×op2+Rdh Rdl
Rdh、Rdl和op2均为寄存器。Rn和op2的值为32位的有符号数,Rdh Rdl的值为64位的加数。
例如:
SMLAL R0,R1,R2,R3
;R0=R2×R3的低32位+R0
;R1=R2×R3的高32位+R1
13. UMULL 64位无符号数乘法指令(Unsigned Multiply Long)
格式:
UMULL{<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>;
功能:同SMULL指令,但指令中Rn和op2的值为32位的无符号数。
例如:
UMULL R0,R1,R2,R3
;R0=R2×R3的低32位
;R1=R2×R3的高32位
其中R2,R3的值为无符号数
14. UMLAL 64位无符号数乘加指令(Unsigned Multiply-accumulate Long)
格式:
UMLAL {<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>;
功能:同SMLAL指令,但指令中Rn,op2的值为32位的无符号数,Rdh Rdl的值为64位无符号数。
例如:
UMLAL R0,R1,R2,R3
;R0=R2×R3的低32位+R0
;R1=R2×R3的高32位+R1
其中R2,R3的值为32位无符号数
R1,R0的值为64位无符号数
15. AND 逻辑与指令(Logical AND)
格式:AND{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn AND op2
op2可以是寄存器,被移位的寄存器或立即数。一般用于清除Rn的特定几位。
例如:
AND R0,R0,#5
;保持R0的第0位和第2位,其余位清0
16. ORR 逻辑或指令(Logical OR)
格式:ORR{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn OR op2
op2可以是寄存器、被移位的寄存器或立即数。一般用于设置Rn的特定几位。
例如:
ORR R0,R0,#5
;R0的第0位和第2位设置为1,其余位不变
17. EOR 逻辑异或指令(Logical Exclusive OR)
格式:EOR{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn EOR op2
op2可以是寄存器、被移位的寄存器或立即数。一般用于将Rn的特定几位取反。
例如:
EOR R0,R0,#5
;R0的第0位和第2位取反,其余位不变
18. BIC 位清除指令(Bit Clear)
格式:BIC{<cond>}{S} <Rd>,<Rn>,<op2>;
功能:Rd=Rn AND (!op2)
用于清除寄存器Rn中的某些位,并把结果存放到目的寄存器Rd中.
操作数op2是一个32位掩码(mask),如果在掩码中设置了某一位,则清除Rn中的这一位;未设置的掩码位指示Rn中此位保持不变。其中,op2可以是寄存器、被移位的寄存器或立即数。
例如:
BIC R0,R0,#5
;R0中第0位和第2位清0,其余位不变
19. CMP 比较指令(Compare)
格式:CMP{<cond>} <Rn>,<op1>;
功能:Rn-op1
该指令进行一次减法运算,但不存储结果,根据结果更新CPSR中条件标志位的值。
该指令不需要显式地指定S后缀来更改状态标志。其中,操作数op1为寄存器或立即数。
例如:
CMP R0,#5
;计算R0-5,根据结果设置条件标志位
ADDGT R0,R0,#5
;如果R0>5,则执行ADDGT指令
20. CMN 反值比较指令(Compare Negative)
格式:CMN{<cond>} <Rn>,<op1>;
功能:同CMP指令,但寄存器Rn的值是和op1取负的值进行比较。
例如:
CMN R0,#5 ;把R0与-5进行比较
21. TST 位测试指令(Test bits)
格式:TST{<cond>} <Rn>,<op1>;
功能: Rn AND op1
根据结果更新CPSR中条件标志位的值,但不存储结果。
用于检查寄存器Rn是否设置了op1中相应的位。
例如:
TST R0,#5
;测试R0中第0位和第2位是否为1,如果不为1,则与的结果为0,设置CPSR的z位为1,继续下一条指令的执行。
22. TEQ 相等测试指令(Test Equivalence)
格式:TEQ{<cond>} <Rn>,<op1>;
功能: Rn EOR op1
将寄存器Rn的值和操作数op1所表示的值按位作逻辑异或操作,根据结果更新CPSR中条件标志位的值,但不存储结果。
用于检查寄存器Rn的值是否和op1所表示的值相等。
例如:
TEQ R0,#5 ;判断R0的值是否和5相等
跳转指令(4种)
1. B 跳转指令(Branch)
格式:B{<cond>} <addr>;
功能: PC= PC+ addr左移两位
addr的值是相对当前PC(即寄存器R15)的值的一个偏移量,而不是一个绝对地址,它是24位有符号数。实际地址的值由汇编器来计算.
addr的值有符号扩展为32位后,左移两位,然后与PC值相加,即得到跳转的目的地址。
跳转的范围为-32MB~+32MB。
例如:
B exit; 程序跳转到标号exit处
…
exit…
2. BL 带返回的跳转指令(Branch with Link)
格式:BL{<cond>} <addr>;
功能:同B指令,但BL指令执行跳转操作的同时,还将PC(寄存器R15)的值保存到LR寄存器(寄存器R14)中。
该指令用于实现子程序调用,程序的返回可通过把LR寄存器的值复制到PC寄存器中来实现。
例如:
BL func; 调用子程序func
…
func
…
MOV R15,R14; 子程序返回
3. BLX 带返回和状态切换的跳转指令(Branch,Link and Exchange)
格式:BLX <addr>;或BLX <Rn>;
功能:处理器跳转到目标地址处,并将PC(寄存器R15)的值保存到LR寄存器(R14)中。
如果目标地址处为Thumb指令,则程序状态从ARM状态切换为Thumb状态。
该指令用于子程序调用和程序状态的切换。
例如:
BLX T16; 跳转到标号T16处执行,T16后面的指令为Thumb指令
…
CODE16
T16 后面指令为Thumb指令
…
4. BX 带状态切换的跳转指令(Branch and Exchange)
格式: BX{<cond>} <Rn>
功能:处理器跳转到目标地址处,从那里继续执行;<cond>为指令执行的条件码。当<cond>忽略时指令为无条件执行。
<Rm>该寄存器中为跳转的目标地址。当寄存器的bit[0]为0时,目标地址处的指令为ARM指令;
当寄存器的bit[0]为1时,目标地址处的指令为Thumb指令。
例如:
ADR R0,exit ;标号exit处的地址装入R0中
BX R0 ;跳转到exit处
ARM指令集--相关指令的功能相关推荐
- 【汇编语言与计算机系统结构笔记01】x86/MIPS/ARM指令集概述与特性,一篇HPCA引发的思考(商业生态的决定性作用)
资源Bilibili AV46914471 + AV57921488 汇编语言与计算机系统结构 清华大学 张悠慧 本次笔记内容: 01.汇编语言与计算机系统结构 02.汇编基础知识--指令集综述 文章 ...
- ARM 指令集 和 Thumb 指令集
From:https://gitee.com/lsliushuang/ASM/blob/master/arm汇编.txt ARM 汇编指令集汇总:https://blog.csdn.net/qq_40 ...
- ARM指令集与Thumb指令集--区别关联--汇编指令 BX LR ; 跳转回LR地址处,既可以是ARM模式也可以是Thumb模式
BX LR ; 跳转回LR地址处,既可以是ARM模式也可以是Thumb模式 A 一.现在先区分下ARM指令集与Thumb指令集 Thumb 指令可以看作是 ARM 指 ...
- x86指令集和arm指令集部分对比
本文主题:本文主要对比了x86 ISA 和 arm ISA的部分区别. 目录 一.x86 ISA 1.指令组成 二.指令各部分解析 1.Instruction Prefixes(可选部分) 2.Opc ...
- ARM 指令集跳转指令
一.跳转指令 跳转指令用于实现程序流程的跳转,在ARM 程序中有两种方法可以实现程序流程的跳转: Ⅰ.使用专门的跳转指令. Ⅱ.直接向程序计数器PC 写入跳转地址值. 通过向程序计数器PC 写入跳转地 ...
- ARM指令集复习 | 基本指令用法
文章目录 1.ARM指令集概述 2.ARM的寻址方式 2.1 立即寻址 2.2 寄存器寻址 2.3 多寄存器及块拷贝寻址 2.4 堆栈寻址 2.5 相对寻址 3.ARM指令集 3.1 存储器访问(L/ ...
- Cortex、ARMv8、arm架构、ARM指令集、soc?Cortex A8、A9都是ARMv7a 架构;Cortex M3、M4是ARMv7m架构;前者是处理器(内核)后者是指令集的架构(架构)
架构组成元素的指令集状态或者语法thumb指令集与arm指令集的区别例如thumb指令集是什么_thumb指令集与arm指令集的区别以及thumb-2的关系在下一文中介绍,本文暂时不讨论 有粉丝问我到 ...
- ARM知识扫盲-RISC架构-ARM寄存器-ARM指令集
文章目录 简介: ARM寄存器 特殊寄存器 ARM指令集 简介: ARM本身使用的是RISC精简指令集架构,除此之外还有开源的RISC指令集架构RISC-V,复杂指令集CISC(Complex Ins ...
- 到底什么是Cortex、ARMv8、arm架构、ARM指令集、soc?一文帮你梳理基础概念【科普】
前言 有粉丝问我到底什么是ARM,搞不清楚Cortex.arm内核.arm架构.ARM指令集.soc这些概念都是什么关系,下面一口君给大家整理一下关于ARM相关的一些概念. 1.ARM既可以认为是一个 ...
- ARM指令集 VS Thumb指令集
1 thumb指令集概述 为兼容数据总线宽度为16位的应用系统,ARM体系结构除了支持执行效率很高的32位ARM指令集以外,同时支持16位的Thumb指令集. Thumb指令集是ARM指令集的一个子集 ...
最新文章
- C/C++:多个.cpp文件包括同一个.h头文件定义方法
- android调用unity,大神们,请问unity和Android交互的时候,为什么总是调用不到方法...
- 页面金额显示两位小数点问题
- Distributed Systems笔记-Cryptographic Protocols
- 人体工学腰垫,保腰神器,改善久坐腰酸背痛
- 测试题的答案(技术博客)
- 机器学习入门(1)之基本概念简介
- 怎么样把c语言和单片机融合,求助怎么把两个单片机c语言程序结合在一起?大一期末实验...
- 安卓手机访问 ubuntu 共享的方法
- Iass、Pass、Sass三种云服务有什么区别?
- 20145312 《信息安全系统设计基础》实验三 实时系统的移植
- 杂谈 跟编程无关的事情11
- android espresso web,Espresso Web
- beats 耳机 android,Beats app安卓,Beats app安卓耳机管理预约 v2.3.5 - 游戏盒子下载站...
- PAT 1029 Median
- TEC-XP 汇编学习
- 神经网络物联网应用技术就业前景【欢迎补充】
- 宣传片拍摄过程详细解析
- 惠普HP DesignJet Z2100 打印机驱动
- DevE控件chartControl 基本用法
热门文章
- android5开机动画耗时,Android 开机速度优化
- 获取自身进程结构和csrss.exe进程结构 explorer.exe进程结构
- tushare找出箱体突破点
- Android Java 颜色代码 对照表
- 【热门主题】紫色梦幻天使win7主题
- 锋利的jQuery系列一
- 网上购物系统c语言代码,网上购物系统源代码要怎么搭建才是最好的?
- html 调用离线地图,百度地图API1.1制作的离线地图控件(html+webbroswer)
- 齿轮标准模数c语言编程,标准齿轮模数齿数计算公式汇总.pdf
- C语言实现读取elf文件某section