IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> ARM指令集--相关指令的功能 -> 正文阅读

[嵌入式]ARM指令集--相关指令的功能

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处

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-11-26 09:00:42  更:2021-11-26 09:03:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:23:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码