【Cortex-M3权威指南】学习笔记2 - 指令集

目录

    • 指令集
      • 汇编语言基础
        • UAL
      • 近距离检视指令
        • 数据传输
        • 数据处理
        • 子程呼叫与无条件跳转指令
        • 标志位与条件转移
        • 指令隔离指令
        • 饱和运算
      • CM3 中新引入指令
        • MRS\MSR
        • IF-THEN
        • CBZ/CBNZ
        • SDIV/UDIV
        • REV RBIT
        • SXTB
        • TBB,TBH

指令集


汇编语言基础

一条简单的汇编指令格式(注释使用一个分号):
操作码 操作数 1, 操作数 2, … ;注释

下面表示寄存器移位存储方法,对于立即数必须要以#开头

MOV R0, #0x12 ; R0 -> 0x12
MOV R1, #’A’ ; R1 -> 字母 A 的 ASCII 码

EQU 指示字来定义常数
DCI 编译器指示字,用来表示某些汇编器无法识别的特殊指令助记符
DCB 来定义一串字节常数
DCD 来定义一串 32 位整数

DCI 0xBE00 ; 用于指代断点BKPT

DCD 0x123 ; 定义整数

DCB "heloworld",0 ; 定义字符串

UAL

统一汇编语言(UAL),是一个语法规则,用于支持 Thumb-2

你依然可以使用传统的 thumb 语法,这里不做介绍

ADD R0, R0, R1  ;等效R0=RO+R1

ANDS R0, R0, R1

ADDS.N R0, #1 ;指定使用 16 位指令(N=Narrow)
ADDS.W R0, #1 ;指定使用 32 位指令(W=Wide)

近距离检视指令

数据传输

CM3 中的数据传送类型有如下几个

  • 在两个寄存器间传送数据
  • 在寄存器与存储器间传送数据
  • 在寄存器与特殊功能寄存器间传送数据
  • 把一个立即数加载到寄存器

常用存储器访问指令
(LDR 加载指令,STR 存储指令)

LDRB Rd, [Rn, #offset] 从地址 Rn+offset 处读取一个字节送到 Rd

LDRD Rd1, Rd2, [Rn, #offset] 从地址 Rn+offset 处读取一个双字(64 位整数)送到 Rd1(低 32 位)和 Rd2(高 32 位)中

STR Rd, [Rn, #offset] 把 Rd 中的低字存储到地址 Rn+offset 处


常用的多重存储器访问方式
在这里插入图片描述

感叹号的作用是:

STMIA.W R8!, {r0-R3} ; R8 值变为 0x8010,每存一次增一次,先存储后自增
)。增/减单位:字(4 字节)。例如,记R8=0x8000,则下面两
条指令:
STMDB.W R8, {R0-R3} ; R8 值的“一个内部复本”先自减后再存储数据,但 R8 的值不变```

带预索引的 LDR 和 STR

LDR.W R0, [R1, #20]! 该指令先把地址 R1+offset 处的值加载到 R0,然后,R1 <- R1+ 20


后索引:在后索引中,基址寄存器是无条件被更新,省略感叹号

STR.W R0 [R1], #-12 该指令是把 R0 的值存储到地址 R1 处的。在存储完毕后, R1 <- R1+(-12)

注:利用 LDR 和 STR 时,可以使用寄存器作为偏移值,而不用背立即数
但如果拿寄存器作偏移值就绝对不可以使用预索引和后索引了


LDR 伪指令和 ADR 伪指令

LDR r0, =address1:将地址 address1 的立即数加载到寄存器 r0 中。

ADR r0, address1:将标签 address1 的地址加载到寄存器 r0 中


数据处理

ADD 指令有如下几个用法

  • ADD R0, R1 ; R0 += R1
  • ADD R0, #0x12 ; R0 += 12
  • ADD.W R0, R1, R2 ; R0 = R1+R2

除了 ADD 指令之外,CM3 中还包含 SUB, MUL, UDIV/SDIV 等用于算术四则运算

SUB Rd, Rm 常规减法,Rd -= Rn
SBC Rd, Rm 带错位的减法,Rd -= Rm+C
RSB.W Rd, Rn, #imm12 反向减法,Rd = imm12-Rn
MUL Rd, Rm 常规乘法,Rd *= Rm


常规逻辑操作
在这里插入图片描述


移位以及循环指令

LSL Rd, Rn, #imm5 ; Rd = Rn<<imm5 逻辑左移
LSR Rd, Rn, #imm5 ; Rd = Rn>>imm5 逻辑右移
ASR Rd, Rn, #imm5 ; Rd = Rn>>imm5 算数右移

其余指令出现频率很低,面试不会细分考察,我们仅需掌握重点简单的内容就好了,别为难自己


子程呼叫与无条件跳转指令

最基础的两个无条件跳转指令:

  • B Label 跳转到 Label 处对应的地址
  • BX reg 跳转到由寄存器 reg 给出的地址
  • BL Label 跳转到 Label 对应的地址,并且把跳转前的下条指令地址保存到 LR
  • BLX reg 跳转到由寄存器 reg 给出的地址,并根据 REG 的 LSB 切换处理器状态,还要把转移前的下条指令地址保存到 LR

在执行 BLX 时,必须置位 LSB=1,否则触发 fault


标志位与条件转移

应用程序状态寄存器(APSR)中存在 5 个标志位
标志位用于表示程序执行过程中的状态信息和操作结果的特性

以下为 APSR 中的四个可被条件转移指令参考的标志位

  1. N(Negative):表示最近的算术或逻辑操作结果为负数。它用于判断操作结果的符号。
  2. Z(Zero):表示最近的算术或逻辑操作结果为零。它用于检测操作结果是否为零。
  3. C(Carry):表示最近的无符号算术操作产生了进位或借位。它用于处理多字节算术运算中的进位或借位。
  4. V(Overflow):表示最近的有符号算术操作产生了溢出。它用于检测有符号数运算的溢出情况。

下表展示了各种可供我们使用的跳转条件,当对应标志位置位后进入跳转流程

在这里插入图片描述

以上条件组合常配合无条件转移指令(B)使用,使之变成各式条件转移指令
BEQ label 表示当 z 被置位为 1 时跳转到位置 label
MOVGT R2, R1


条件跳转例子:

  • CMP 表示为两个数作差,并根据差的结果设置标志位
  • 根据上方四个标志位,可知当算数运算结果等于 0 时,触发 z=1
  • 故当 R0==R1==0 时,触发 z=1,此时 BEQ 检测到标志位置位,即进入跳转流程,跳转到 label 标注的位置
CMP R0, R1
BEQ label

指令隔离指令

指令隔离(Instruction Barrier)指令是一种用于确保指令执行顺序和内存访问顺序的特殊指令,一般用于多核处理器和多线程环境

如果 CM3 缺少对应的隔离措施,就会发生所谓的“紊乱现象”

下面为 CM3 中的 3 条隔离指令

  1. ISB(Instruction Synchronization Barrier):执行 ISB 指令会导致处理器暂停执行,直到之前的所有指令都已完成执行,同时将所有未决的中断和异常处理完毕。这可以确保在 ISB 指令之前的所有指令都已经完成执行,防止指令重排序。
  2. DSB(Data Synchronization Barrier):执行 DSB 指令会导致处理器暂停执行,直到之前的所有数据访问指令都已经完成。这可以确保在 DSB 指令之前的所有数据访问指令都已经完成,防止数据访问重排序。DSB 指令还可以用于确保处理器与外部设备之间的数据同步。
  3. DMB(Data Memory Barrier):执行 DMB 指令会导致处理器暂停执行,直到之前的所有数据访问指令和内存访问指令都已经完成。这可以确保在 DMB 指令之前的所有数据和内存访问都已经完成,防止数据和内存访问重排序。DMB 指令还可以用于确保处理器与外部设备之间的数据同步。

饱和运算

饱和运算类似于模电中的削顶失真,即通过使用 SSAT 指令,将大数据(32 位)截断为小数据(16 位)

SSAT.W Rd, #imm5, Rn, {,shift}

  • Rd:目标寄存器,用于存储截断后的结果。
  • #imm5:一个立即数,表示要截断的位数,取值范围为 1 到 32。
  • Rn:源寄存器,包含要进行截断操作的原始数据。
  • {,shift}:可选参数,用于指定可选的移位操作,可以是 LSL(逻辑左移)、LSR(逻辑右移)、ASR(算术右移)或 ROR(循环右移)。

CM3 中新引入指令

这些指令从 ARMv6,ARMv7 才开始支持

MRS\MSR

这两条指令仅可以在以下两种情况下使用:

  1. 特权级
  2. APSR 下的用户级

命令语法
MRS <Rn>, <SReg> 加载特殊功能寄存器的值到 Rn
MSR <Sreg>,<Rn> 存储 Rn 的值到特殊功能寄存器

在这里插入图片描述


IF-THEN

IF-THEN(IT)指令围起一个块,里面最多有 4 条指令

其中 T 代表条件成立时执行的语句,E 代表条件不成立时执行的语句
E 对应指令必须和 T 对应指令相反!

下面展示了对应伪代码和使用方式

在这里插入图片描述


CBZ/CBNZ

CBZ(Compare and Branch if Zero):CBZ 指令用于比较一个寄存器的值是否为零,如果为零,则执行跳转操作到指定的目标地址。

CBNZ 含义与 CBZ 相反

格式:

CBZ <寄存器>, <目标地址>    ; 如果寄存器的值为零,则跳转到目标地址
CBNZ <寄存器>, <目标地址>   ; 如果寄存器的值不为零,则跳转到目标地址

SDIV/UDIV

32 位硬件除法指令

SDIV.W Rd, Rn, Rm
UDIV.W Rd, Rn, Rm

REV RBIT

REV 反转 32 位整数中的字节序,REVH 则以半字为单位反转,且只反转低半字

REV Rd, Rm
REVH Rd, Rm
REV16 Rd, Rm
REVSH Rd, Rm

RBIT 比前面的 REV 之流更精细,它是按位反转的,相当于把 32 位整数的二进制表示法水平旋
转 180 度

RBIT.W Rd, Rn

SXTB

用于将数据宽度转换成带符号位 32 位整数长度

带 U 字头的表示高位清零

SXTB Rd, Rn
SXTH Rd, Rn
UXTB Rd, Rn
UXTH Rd, Rn

TBB,TBH

TBB(Table Branch Byte):TBB 指令用于通过查找表的方式进行跳转。它将一个字节大小的偏移量添加到基地址寄存器中,并跳转到所得到的目标地址。

TBB [<基地址寄存器> + <偏移量寄存器>]

TBH(Table Branch Halfword):相对应处理的就是半字数据

TBH [<基地址寄存器> + <偏移量寄存器> * 2]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/90634.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

持续集成与持续交付:现代软件测试的变革之路

引言 在数字化时代&#xff0c;软件开发的速度和复杂性都在不断增加。为了满足市场的需求&#xff0c;企业需要更快、更高效地交付高质量的软件产品。在这样的背景下&#xff0c;持续集成与持续交付&#xff08;CI/CD&#xff09;成为了软件开发和测试的核心实践。 软件开发的…

UE4/5的Custom节点:在VScode使用HLSL(新手入门用)

目录 custom节点 VSCode环境安装 将VSCode里面的代码放入Custom中 custom节点 可以看到这是一个简单的Custom节点&#xff1a; 而里面是可以填写代码的&#xff1a; 但是在这里面去写代码会发现十分的繁琐【按下enter后&#xff0c;不会换行&#xff0c;也不会自动缩进】 …

Android scrollTo、scrollBy、以及scroller详解 自定义ViewPager

Scroller VelocityTracker VelocityTracker 是一个速度跟踪器&#xff0c;通过用户操作时&#xff08;通常在 View 的 onTouchEvent 方法中&#xff09;传进去一系列的 Event&#xff0c;该类就可以计算出用户手指滑动的速度&#xff0c;开发者可以方便地获取这些参数去做其他…

jemter连接数据json断言

文章目录 一、jmeter连接数据库1、加载JDBC驱动2、连接数据3、SQL Query的Query Type使用方法&#xff1a;4、Variable Name使用方法&#xff1a;5、Result variable name使用方法&#xff1a; 二、Json响应断言1、添加 》 断言 》 JSON断言2、JSON断言界面参数说明&#xff1a…

RH1288V3 - 初识物理服务器

如果你拥有一台物理服务器(不是云服务器) 个人比较推荐你用物理服务器&#xff0c;虽然性能会比云要来的差&#xff0c;但是不用每月交钱上。云服务固然方便&#xff0c;但是几个核的性能和一点存储&#xff0c;想做一个动漫网站固然要很多mp4这种影视资源&#xff0c;云服务器…

React+Typescript 父子组件事件传值

好 之前我们将 state 状态管理简单过了一下 那么 本文 我们来研究一下事假处理 点击事件上文中我们已经用过了 这里 我们就不去讲了 主要来说说 父子之间的事件 我们直接来编写一个小dom 我们父组件 编写代码如下 import Hello from "./components/hello";functio…

mysql profiling profiles profile

要想优化一条 Query&#xff0c;我们就需要清楚的知道这条 Query 的性能瓶颈到底在哪里&#xff0c;是消耗的 CPU计算太多&#xff0c;还是需要的的 IO 操作太多&#xff1f;要想能够清楚的了解这些信息&#xff0c;在 MySQL 5.0 和 MySQL 5.1正式版中已经可以非常容易做到了&a…

k8s之Pod及Probe 探针机制(健康检查机制)

文章目录 1、Pod1.1、定义1.2、Pod的形式1.3、Pod的使用1.4、 Pod生命周期1.5、初始化容器1.6、临时容器1.6.1、定义1.6.2、使用临时容器的步骤 1.7、静态Pod1.8、创建带标签的pod1.9、容器生命周期回调1.10、容器镜像使用秘钥从私有仓库下载1.11、多容器协同工作 2、Probe 探针…

第二讲Java基本语法(变量、数据类型、运算符)

一、前言导读 上一讲,我们安装java的开发工具idea,并且简单介绍如何使用,初步认识了Java的helloworld,我们写了第一行代码,有了初步的印象,接下来我们将真正展开对于java的了解,从这一讲开始,请大家做好笔记,改背的背。为什么说Java是一门编程语言呢,主要是他跟英语一…

基于单片机串口控制直流电机调速

一、系统方案 (2)本设计采用STC89C5单片机作为主控器&#xff0c;串口控制直流电机调速&#xff0c;串口助手发送1-8&#xff0c;改变电机速度&#xff0c;数码管显示对应速度。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 TMOD0x21;//定…

❤ 给自己的mac系统上安装java环境

❤ 给自己的mac系统上安装java环境 &#x1f353; 作为前端工程师如何给自己的mac系统上安装java环境 &#x1f34e; 最近因为自己的一些项目需求&#xff0c;mac电脑上需要安装一些后台的java环境&#xff0c;用来跑后台的java程序&#xff0c;于是从一个前端工程师的角度安…

淘宝API技术解析,实现关键词搜索淘宝商品(商品详情接口等)

淘宝提供了开放平台接口&#xff08;API&#xff09;来实现按图搜索淘宝商品的功能。您可以通过以下步骤来实现&#xff1a; 获取开放平台的访问权限&#xff1a;首先&#xff0c;您需要在淘宝开放平台创建一个应用&#xff0c;获取访问淘宝API的权限。具体的申请步骤和要求可以…

简单js逆向案例(2)

文章目录 前文分析完整代码结尾 前文 本文章中所有内容仅供学习交流&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 分析 目标网址 aHR0cHM6Ly9zZWFyY2guYmlkY2VudGV…

SLAM十四讲学习笔记 第二期:部分课后实践代码

持续更新.... 前期准备第二讲实验一&#xff1a;简单输出 第五讲任务一&#xff1a;imageBasics&#xff08;Ubuntu配置opencv&#xff09;任务二&#xff1a;双目匹配点云&#xff08;Ubuntu配置pangolin&#xff09;检验部分我认为可以加深对CMake的理解 任务三&#xff1a;r…

10*1000【2】

知识: -----------金融科技背后的技术---------------- -------------三个数字化趋势 1.数据爆炸&#xff1a;internet of everything&#xff08;iot&#xff09;&#xff1b;实时贡献数据&#xff1b;公有云服务->提供了灵活的计算和存储。 2.由计算能力驱动的&#x…

Android Xfermode 使用解析

自定义绘制之图片 canvar.drawBitmap() ,BitMapFactory private fun getBitmap(width: Int): Bitmap? {val option BitmapFactory.Options()option.inJustDecodeBounds trueBitmapFactory.decodeResource(resources, R.mipmap.android111,option)option.inJustDecodeBounds…

Oracle数据库快速入门

前言&#xff1a; 我想现在很多人的入门数据库都是mysql&#xff0c;但是由于工作中会接触到Oracle数据库&#xff0c;如果你有MySQL的基础的话&#xff0c;这篇文章能让你很快掌握Oracle。 目录 1.体系结构 2.创建用户和表空间 2.1.创建表空间 2.2.创建用户 3.数据类型…

Jvm之JIT优化详细解释

文章目录 一、JIT 产生的背景二、HotSpot虚拟机内置JIT编译器1. Client Compiler2. Server Compiler3. 查看本地编译器模式 三、常见热点探测技术1. 基于计数器的热点探测2. 基于采样的热点探测2.1 方法调用计数器2.2 回边计数器 四、常见JIT优化手段1. 公共子表达式消除2. 方法…

NGINX的速率限制(限流)

NGINX 的速率限制&#xff08;限流&#xff09; NGINX最有用但经常被误解和配置错误的功能之一是限流。它允许您限制用户在给定时间段内可以发出的HTTP请求量。 限流可以用于安全目的&#xff0c;例如减慢暴力破解密码的攻击。它可以通过限制请求速率为真实用户的典型值来帮助…

OpenAI推出GPT-3.5Turbo微调功能并更新API;Midjourney更新局部绘制功能

&#x1f989; AI新闻 &#x1f680; OpenAI推出GPT-3.5Turbo微调功能并更新API&#xff0c;将提供GPT-4微调功能 摘要&#xff1a;OpenAI宣布推出GPT-3.5Turbo微调功能&#xff0c;并更新API&#xff0c;使企业和开发者能够定制ChatGPT&#xff0c;达到或超过GPT-4的能力。通…