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 类:

  • 跳转指令
  • 数据处理指令
  • 程序状态寄存器(PSR)转移指令
  • Load/Store 指令
  • 协处理器指令
  • 异常中断产生指令

指令的一般格式

ARM 指令的一般编码格式

<opcode> {<cond>}{S} <Rd>,<Rn>,<shifter_operand>

opcode:是指令助记符,如 ADD 表示算数加法操作指令

cond:表示指令执行的条件

S:决定指令的操作是否影响 CPSR 的值

Rd:表示目标寄存器

Rn:表示包含第 1 个操作数的寄存器

shifter_operand:表示第 2 个操作数

跳转指令

  • B 跳转指令
    • 仅仅执行跳转操作
  • BL 带返回的跳转指令
    • 执行跳转操作的同时还将 PC 寄存器的值保存在 LR 寄存器中,BL 指令用于实现子程序调用,子程序的返回可以通过将 LR 寄存器的值复制到 PC 寄存器中来实现
  • BX 带状态切换的跳转指令
    • BX 指令跳转到指令中指定的目标地址,目标地址处的指令可以是 ARM 指令,也可以是 Thumb 指令
  • BLX 带返回和状态切换的跳转指令
    • 从 ARM 指令跳转到指令中指定的目标地址,目标地址可以是 ARM 指令,也可以是 Thumb 指令

数据处理指令

数据处理指令又分为三类

数据传送指令:如 MOV

算数逻辑运算指令:如 ADD

比较指令:如 TST

  • MOV:数据传送指令
  • MVN:数据求反传送指令
  • CMP:比较指令
  • CMN:基于相反数的比较指令
  • TST:位测试指令
  • TEQ:相等测试指令
  • ADD:加法指令
  • SUB:减法指令
  • RSB:逆向加法指令
  • ADC:带位加法指令
  • SBC:带位减法指令
  • RSC:带位逆向减法指令
  • AND:逻辑与操作指令
  • BIC:位清除指令
  • EOR:逻辑异或操作指令
  • ORR:逻辑或操作指令

MOV 传送指令

MOV 指令将 <shifter_operand> 表示的数据传送到目标寄存器 中,并根据操作的结果更新 CPSR 相应的条件标志位

指令的语法格式:

MOV {<cond>}{S} <Rd>,<shifter_operand>

cond:为指令执行的条件码

S:决定指令的操作是否影响 CPSR 中条件标志位的值

Rd:寄存器为目标寄存器

shifter_operand:为向目标寄存器传送的数据

MOV 指令完成的功能:

  • 将数据从一个寄存器传送到另一个寄存器
  • 将一个常数传送到一个寄存器中
  • 实现单纯的移位操作。左移操作可以实现将操作数乘以 2 n 次方
  • 当 PC 寄存器作为目标寄存器是可以程序跳转。这种跳转可以实现子程序调用以及从子程序中返回
  • 当 PC 寄存器作为目标寄存器且指令中 S 位被设置时,指令在执行跳转操作的同时,将当前处理器模式的 SPSR 寄存器内容复制到 CPSR 中。这样 MOVS PC,LR 可以实现从某些异常中断中返回。

MVN 传送指令

MVN 指令将 <shifter_operand> 表示的数据的反码传送到目标寄存器 中,并根据操作的结果更新 CPSR 相应的条件标志位

指令的语法格式:

MVN {<cond>}{S} <Rd>,<shifter_operand>

其中各参数的用法与 MOV 传送指令相同

MVN 指令有以下用途

  • 向寄存器中传送一个负数
  • 生成位掩码
  • 求一个数的反码

ADD 加法指令

ADD 指令将 <shifter_operand> 表示的数据与寄存器 中的值相加,并把结果保存在目标寄存器 中,同时根据操作的结果更新 CPSR 中相应的标志位

ADD 指令实现两个操作数相加

指令的语法格式

ADD {<cond>}{S} <Rd>,<Rn>,<shifter_operand>

cond:为指令执行的条件码

S:决定指令的操作是否影响 CPSR 中条件标志位的值

Rd:寄存器为目标寄存器

Rn:寄存器为第 1 个源操作数所在的寄存器

shifter_operand:为向目标寄存器传送的数据

示例:

ADD Rx, Rx,#1           ;Rx=Rx+1
ADD Rd, Rx, Rx, LSL, #n ;Rd=Rx+Rx*(2*n)
ADD Rs, PC, #offset     ;生成基于 PC 的跳转指针

ADC 带位加法指令

ADC 指令将 <shifter_operand> 表示的数据与寄存器 中的值相加,再加上 CPSR 中 C 条件标志位的值,并把结果保存在目标寄存器 中,同时根据操作的结果更新 CPSR 中相应的标志位

指令的语法格式

ADC {<cond>}{S} <Rd>,<Rn>,<shifter_operand>

cond:为指令执行的条件码

S:决定指令的操作是否影响 CPSR 中条件标志位的值

Rd:寄存器为目标寄存器

Rn:寄存器为第 1 个源操作数所在的寄存器

shifter_operand:为向目标寄存器传送的数据

ADC 指令和 ADD 指令联合使用可以实现两个 64 位的操作数相加。

如果寄存器 R0 和 R1 中放置一个 64 位的源操作数,其中 R0 中放置低 32 位数值,R1 中放置高 32 位数据,

如果寄存器 R2 和 R3 中放置另一个 64 位的源操作数,其中 R2 中放置低 32 位数值,R3 中放置高 32 位数据,

下面的指令序列实现了两个 64 位操作数的加法操作

ADDS R4,R0,R2
ADC R5,R1,R3

若将 ADC R5,R1,R3 指令改为 ADCS R5,R1,R3,操作结果将影响到 CPSR 寄存器中相应的条件标志位的值

SUB 减法指令

SUB 指令从寄存器 中减去 <shifter_operand> 表示的数值,并把结果保存到目标寄存器 中,同时根据操作的结果更新 CPSR 中相应的条件标志位。

指令的语法格式

SUB {<cond>}{S} <Rd>,<Rn>,<shifter_operand>

cond:为指令执行的条件码

S:决定指令的操作是否影响 CPSR 中条件标志位的值

Rd:寄存器为目标寄存器

Rn:寄存器为第 1 个源操作数所在的寄存器

shifter_operand:为向目标寄存器传送的数据

SUB 指令实现两个操作数相减

示例:

SUB Rx,RX,#1         ;Rx=Rx-1

SBC 带位减法指令

SBC 指令从寄存器 中减去 <shifter_operand> 表示的数值,再减去 CPSR 中 C 条件标志位的反码,并把结果保存到目标寄存器 中,同时根据操作的结果更新 CPSR 中相应的条件标志位。

指令的语法格式

SBC {<cond>}{S} <Rd>,<Rn>,<shifter_operand>

cond:为指令执行的条件码

S:决定指令的操作是否影响 CPSR 中条件标志位的值

Rd:寄存器为目标寄存器

Rn:寄存器为第 1 个源操作数所在的寄存器

shifter_operand:为向目标寄存器传送的数据

RSB 逆向减法指令

RSB 指令从 <shifter_operand> 表示的数值中减去寄存器 值,并把结果保存到目标寄存器 中,同时根据操作的结果更新 CPSR 中相应的条件标志位。

指令的语法格式

RSB {<cond>}{S} <Rd>,<Rn>,<shifter_operand>

cond:为指令执行的条件码

S:决定指令的操作是否影响 CPSR 中条件标志位的值

Rd:寄存器为目标寄存器

Rn:寄存器为第 1 个源操作数所在的寄存器

shifter_operand:为向目标寄存器传送的数据

示例:

RSB Rd, Rx, #0;            Rd=-Rx

RSC 带位逆向减法指令

RSC 指令从 <shifter_operand> 表示的数值中减去寄存器 值,再减去寄存器 CPSR 中 C 条件标志位的反码,并把结果保存到目标寄存器 中,同时根据操作的结果更新 CPSR 中相应的条件标志位。

指令的语法格式

RSC {<cond>}{S} <Rd>,<Rn>,<shifter_operand>

cond:为指令执行的条件码

S:决定指令的操作是否影响 CPSR 中条件标志位的值

Rd:寄存器为目标寄存器

Rn:寄存器为第 1 个源操作数所在的寄存器

shifter_operand:为向目标寄存器传送的数据

AND 逻辑与操作指令

AND 指令将 <shifter_operand> 表示的数值中与寄存器 的值按位做逻辑与操作,,并把结果保存到目标寄存器 中,同时根据操作的结果更新 CPSR 中相应的条件标志位。

指令的语法格式

AND {<cond>}{S} <Rd>,<Rn>,<shifter_operand>

cond:为指令执行的条件码

S:决定指令的操作是否影响 CPSR 中条件标志位的值

Rd:寄存器为目标寄存器

Rn:寄存器为第 1 个源操作数所在的寄存器

shifter_operand:为向目标寄存器传送的数据

ORR 逻辑或操作指令

ORR 指令将 <shifter_operand> 表示的数值中与寄存器 的值按位做逻辑或操作,,并把结果保存到目标寄存器 中,同时根据操作的结果更新 CPSR 中相应的条件标志位。

指令的语法格式

ORR {<cond>}{S} <Rd>,<Rn>,<shifter_operand>

cond:为指令执行的条件码

S:决定指令的操作是否影响 CPSR 中条件标志位的值

Rd:寄存器为目标寄存器

Rn:寄存器为第 1 个源操作数所在的寄存器

shifter_operand:为向目标寄存器传送的数据

EOR 逻辑或操作指令

EOR 指令将 <shifter_operand> 表示的数值中与寄存器 的值按位做逻辑异或操作,,并把结果保存到目标寄存器 中,同时根据操作的结果更新 CPSR 中相应的条件标志位。

指令的语法格式

EOR {<cond>}{S} <Rd>,<Rn>,<shifter_operand>

cond:为指令执行的条件码

S:决定指令的操作是否影响 CPSR 中条件标志位的值

Rd:寄存器为目标寄存器

Rn:寄存器为第 1 个源操作数所在的寄存器

shifter_operand:为向目标寄存器传送的数据

BIC 位清除指令

BIC 指令将 <shifter_operand> 表示的数值中与寄存器 的值的反码按位做逻辑与操作,,并把结果保存到目标寄存器 中,同时根据操作的结果更新 CPSR 中相应的条件标志位。

指令的语法格式

BIC {<cond>}{S} <Rd>,<Rn>,<shifter_operand>

cond:为指令执行的条件码

S:决定指令的操作是否影响 CPSR 中条件标志位的值

Rd:寄存器为目标寄存器

Rn:寄存器为第 1 个源操作数所在的寄存器

shifter_operand:为向目标寄存器传送的数据

CMP 比较指令

CMP 指令从寄存器 中减去 <shifter_operand> 表示的数值,根据操作的结果更新 CPSR 中相应的条件标志位,后面的指令就可以根据 CPSR 中相应的条件标志位来判断是否执行。

指令的语法格式

CMP {<cond>}<Rn>,<shifter_operand>

cond:为指令执行的条件码

Rn:寄存器为第 1 个源操作数所在的寄存器

shifter_operand:为向目标寄存器传送的数据

CMN 基于相反数的比较指令

CMN 指令从寄存器 中加上 <shifter_operand> 表示的数值,根据操作的结果更新 CPSR 中相应的条件标志位,后面的指令就可以根据 CPSR 中相应的条件标志位来判断是否执行。

指令的语法格式

CMN {<cond>}<Rn>,<shifter_operand>

cond:为指令执行的条件码

Rn:寄存器为第 1 个源操作数所在的寄存器

shifter_operand:为向目标寄存器传送的数据

TST 位测试指令

TST 指令将 <shifter_operand> 表示的数值中与寄存器 的值按位做逻辑与操作,根据操作的结果更新 CPSR 中相应的条件标志位

指令的语法格式

TST {<cond>}<Rn>,<shifter_operand>

cond:为指令执行的条件码

Rn:寄存器为第 1 个源操作数所在的寄存器

shifter_operand:为向目标寄存器传送的数据

TEQ 相等测试指令

TEQ 指令将 <shifter_operand> 表示的数值中与寄存器 的值按位做逻辑异或操作,根据操作的结果更新 CPSR 中相应的条件标志位

指令的语法格式

TST {<cond>}<Rn>,<shifter_operand>

cond:为指令执行的条件码

Rn:寄存器为第 1 个源操作数所在的寄存器

shifter_operand:为向目标寄存器传送的数据

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

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/8 4:20:04-

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