文章目录

  • 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指令集--相关指令的功能相关推荐

  1. 【汇编语言与计算机系统结构笔记01】x86/MIPS/ARM指令集概述与特性,一篇HPCA引发的思考(商业生态的决定性作用)

    资源Bilibili AV46914471 + AV57921488 汇编语言与计算机系统结构 清华大学 张悠慧 本次笔记内容: 01.汇编语言与计算机系统结构 02.汇编基础知识--指令集综述 文章 ...

  2. ARM 指令集 和 Thumb 指令集

    From:https://gitee.com/lsliushuang/ASM/blob/master/arm汇编.txt ARM 汇编指令集汇总:https://blog.csdn.net/qq_40 ...

  3. ARM指令集与Thumb指令集--区别关联--汇编指令 BX LR ; 跳转回LR地址处,既可以是ARM模式也可以是Thumb模式

    BX        LR    ; 跳转回LR地址处,既可以是ARM模式也可以是Thumb模式 A 一.现在先区分下ARM指令集与Thumb指令集        Thumb 指令可以看作是 ARM 指 ...

  4. x86指令集和arm指令集部分对比

    本文主题:本文主要对比了x86 ISA 和 arm ISA的部分区别. 目录 一.x86 ISA 1.指令组成 二.指令各部分解析 1.Instruction Prefixes(可选部分) 2.Opc ...

  5. ARM 指令集跳转指令

    一.跳转指令 跳转指令用于实现程序流程的跳转,在ARM 程序中有两种方法可以实现程序流程的跳转: Ⅰ.使用专门的跳转指令. Ⅱ.直接向程序计数器PC 写入跳转地址值. 通过向程序计数器PC 写入跳转地 ...

  6. ARM指令集复习 | 基本指令用法

    文章目录 1.ARM指令集概述 2.ARM的寻址方式 2.1 立即寻址 2.2 寄存器寻址 2.3 多寄存器及块拷贝寻址 2.4 堆栈寻址 2.5 相对寻址 3.ARM指令集 3.1 存储器访问(L/ ...

  7. Cortex、ARMv8、arm架构、ARM指令集、soc?Cortex A8、A9都是ARMv7a 架构;Cortex M3、M4是ARMv7m架构;前者是处理器(内核)后者是指令集的架构(架构)

    架构组成元素的指令集状态或者语法thumb指令集与arm指令集的区别例如thumb指令集是什么_thumb指令集与arm指令集的区别以及thumb-2的关系在下一文中介绍,本文暂时不讨论 有粉丝问我到 ...

  8. ARM知识扫盲-RISC架构-ARM寄存器-ARM指令集

    文章目录 简介: ARM寄存器 特殊寄存器 ARM指令集 简介: ARM本身使用的是RISC精简指令集架构,除此之外还有开源的RISC指令集架构RISC-V,复杂指令集CISC(Complex Ins ...

  9. 到底什么是Cortex、ARMv8、arm架构、ARM指令集、soc?一文帮你梳理基础概念【科普】

    前言 有粉丝问我到底什么是ARM,搞不清楚Cortex.arm内核.arm架构.ARM指令集.soc这些概念都是什么关系,下面一口君给大家整理一下关于ARM相关的一些概念. 1.ARM既可以认为是一个 ...

  10. ARM指令集 VS Thumb指令集

    1 thumb指令集概述 为兼容数据总线宽度为16位的应用系统,ARM体系结构除了支持执行效率很高的32位ARM指令集以外,同时支持16位的Thumb指令集. Thumb指令集是ARM指令集的一个子集 ...

最新文章

  1. C/C++:多个.cpp文件包括同一个.h头文件定义方法
  2. android调用unity,大神们,请问unity和Android交互的时候,为什么总是调用不到方法...
  3. 页面金额显示两位小数点问题
  4. Distributed Systems笔记-Cryptographic Protocols
  5. 人体工学腰垫,保腰神器,改善久坐腰酸背痛
  6. 测试题的答案(技术博客)
  7. 机器学习入门(1)之基本概念简介
  8. 怎么样把c语言和单片机融合,求助怎么把两个单片机c语言程序结合在一起?大一期末实验...
  9. 安卓手机访问 ubuntu 共享的方法
  10. Iass、Pass、Sass三种云服务有什么区别?
  11. 20145312 《信息安全系统设计基础》实验三 实时系统的移植
  12. 杂谈 跟编程无关的事情11
  13. android espresso web,Espresso Web
  14. beats 耳机 android,Beats app安卓,Beats app安卓耳机管理预约 v2.3.5 - 游戏盒子下载站...
  15. PAT 1029 Median
  16. TEC-XP 汇编学习
  17. 神经网络物联网应用技术就业前景【欢迎补充】
  18. 宣传片拍摄过程详细解析
  19. 惠普HP DesignJet Z2100 打印机驱动
  20. DevE控件chartControl 基本用法

热门文章

  1. android5开机动画耗时,Android 开机速度优化
  2. 获取自身进程结构和csrss.exe进程结构 explorer.exe进程结构
  3. tushare找出箱体突破点
  4. Android Java 颜色代码 对照表
  5. 【热门主题】紫色梦幻天使win7主题
  6. 锋利的jQuery系列一
  7. 网上购物系统c语言代码,网上购物系统源代码要怎么搭建才是最好的?
  8. html 调用离线地图,百度地图API1.1制作的离线地图控件(html+webbroswer)
  9. 齿轮标准模数c语言编程,标准齿轮模数齿数计算公式汇总.pdf
  10. C语言实现读取elf文件某section