【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 ; 用于指代断点BKPTDCD 0x123 ; 定义整数DCB "heloworld",0 ; 定义字符串

UAL

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

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

ADD R0, R0, R1  ;等效R0=RO+R1ANDS R0, R0, R1ADDS.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]

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

界面组件DevExpress Reporting——增强的SQL和实体框架数据源引入

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 本文总结了v23.1中针对DevExpress报表和BI Das…

远程调试环境配置

利用vscode的插件把远程连接调试php转化为本地调试php&#xff0c;通讯从php xdebug通讯变成vscode通讯 1.在vscode中安装插件 2.安装对应PHP版本的xdebug xdebug版本兼容参考https://xdebug.org/docs/compat#versions xdebug安装教程1https://blog.csdn.net/song634/article/…

核辐射对生物的影响

目录 1.什么是核辐射 2.核辐射的危害 3.核辐射对环境造成的影响 4.核辐射的影响会持续多长时间 1.什么是核辐射 核辐射是指自然界或人工产生的高能粒子或电磁波的放射性能量。当原子核不稳定时&#xff0c;会发生放射性衰变&#xff0c;释放出核辐射。 核辐射主要分为三种类…

免费图床配置:PicGo + Github + jsDelivr

免费图床配置&#xff1a;PicGo Github jsDelivr 前言PicGo Github配置过程jsdelivr加速踩坑注意事项参考资料 觉得文章有收获&#xff0c;欢迎关注公众号鼓励一下作者呀~ 在学习的过程中&#xff0c;也搜集了一些量化、技术的视频及书籍资源&#xff0c;欢迎大家关注公众号…

秒杀系统的业务流程以及优化方案(实现异步秒杀)

先看基本的业务流程 那么我们可以看到整个流程都是一个线程来完成的&#xff0c;这样的话耗时还是很长的&#xff0c;那么可不可以采用多线程去实现呢&#xff1f; 首先我们要思考怎么对业务进行拆分&#xff0c;可以想象一个我们去饭店点餐&#xff0c;会有前台接待&#xff…

【后端】Core框架版本和发布时间以及.net 6.0启动文件的结构

2023年&#xff0c;第35周&#xff0c;第1篇文章。给自己一个目标&#xff0c;然后坚持总会有收货&#xff0c;不信你试试&#xff01; .NET Core 是一个跨平台的开源框架&#xff0c;用于构建现代化的应用程序。它在不同版本中有一些重要的区别和发布时间 目录 一、Core版本和…

爬虫:绕过5秒盾Cloudflare和DDoS-GUARD

本文章仅供技术研究参考&#xff0c;勿做它用&#xff01; 5秒盾的特点 <title>Just a moment...</title> 返回的页面中不是目标数据&#xff0c;而是包含上面的代码&#xff1a;Just a moment... 或者第一次打开网页的时候&#xff1a; 这几个特征就是被Cloud…

【QT】绘制旋转等待

很高兴在雪易的CSDN遇见你 ,给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 程序中经常会遇到耗时的操作,需要提供等待的窗口,防止用户多次点击造成卡顿等问题。本文分享旋转等待技术,希望对各位小伙伴有所帮助!结果如下:

Unity 之transform.LookAt() 调整一个物体的旋转,使其朝向指定的位置

文章目录 总的介绍补充&#xff08;用于摄像机跟随的场景&#xff09; 总的介绍 transform.LookAt 是 Unity 引擎中 Transform 组件的一个方法&#xff0c;用于调整一个物体的旋转&#xff0c;使其朝向指定的位置。通常情况下&#xff0c;它被用来使一个物体&#xff08;如摄像…

盘点 2023 十大免费开源 WAF

WAF 是 Web Application Firewall 的缩写&#xff0c;也被称为 Web 应用防火墙。区别于传统防火墙&#xff0c;WAF 工作在应用层&#xff0c;对基于 HTTP/HTTPS 协议的 Web 系统有着更好的防护效果&#xff0c;使其免于受到黑客的攻击。 近几年经济增速开始放缓&#xff0c;科…

基于Java+SpringBoot+vue前后端分离可盈保险合同管理系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

SpingMVC拦截器-用户登录权限控制分析

视频链接&#xff1a;08-SpringMVC拦截器-用户登录权限控制代码实现2_哔哩哔哩_bilibili 114 1、做了一个用户跟角色添加的相关操作 1.1 这个后台工程&#xff0c;没有进行相关操作也能够进行登录&#xff1a; 2、现在我做一个用户的权限控制&#xff0c;如果当前我没有进行操…

解决Springboot创建工程时,pom.xml文件中的插件spring-boot-maven-plugin报红

在初始创建工程完成之后&#xff0c;发现pom文件中有错误 spring-boot-maven-plugin这一行会报红 解决办法&#xff1a;在代码中添加版本信息 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-…

Mybatis的综合案例-学生信息查询系统 用于校验是否真正学习掌握了动态SQL

Mybatis的综合案例-学生信息查询系统 需求一&#xff1a;当用户输入的学生姓名不为空&#xff0c;则只根据学生信息进行查询; 当用户输入的学生姓名为空&#xff0c;且专业不为空&#xff0c;那么就根据学生专业进行学生的查询 需求二&#xff1a;查询所有id值小于5的学生信息…

git常用操作命令(不定时更新)

git常用操作命令 将某个分支的某次提交迁移到另外一个分支查询这次提交的ID号方法一方法二 切换到目标分支执行commitID合并指令 将某个分支的某次提交迁移到另外一个分支 查询这次提交的ID号 方法一 方法二 切换到目标分支 git checkout 目标分支名 执行commitID合并指令 gi…

Dataset类实践

Dataset类实践 蚂蚁蜜蜂分类数据集和下载链接https://download.pytorch.org/tutorial/hymenoptera_data.zip Dataset&#xff1a;提供一种方式去获取数据及其lable Q&#xff1a;如何获取每个数据及其lable 重写构造方法和获取标签方法 Q&#xff1a;告诉我们总共有多少数据 …

leetcode739. 每日温度 单调栈

自己思路&#xff1a; 想到用两个栈&#xff0c;一个维护元素、另一个维护下标。但是还是无法处理有重复元素的问题&#xff08;用哈希表来存储的时候&#xff09;。所以就看了答案的思路。 答案思路&#xff1a; 从前往后遍历&#xff0c;维护一个单调栈。栈存放数组的下标。…

WPF基础入门-Class7-WPF-MVVN框架

WPF基础入门 Class7-MVVN框架 使用框架可以省掉如Class6中的ViewModelBase.cs的OnPropertyChanged&#xff0c;亦方便命令传参 1、NuGet安装CommunityToolkit.Mvvm&#xff08;原Mircrosoft.Toolkit.Mvvm&#xff09;也可以安装MVVMLight等其他集成库 2、显示页面&#xff1…

小研究 - JVM 逃逸技术与 JRE 漏洞挖掘研究(五)

Java语言是最为流行的面向对象编程语言之一&#xff0c; Java运行时环境&#xff08;JRE&#xff09;拥有着非常大的用户群&#xff0c;其安全问题十分重要。近年来&#xff0c;由JRE漏洞引发的JVM逃逸攻击事件不断增多&#xff0c;对个人计算机安全造成了极大的威胁。研究JRE安…

Compose - 基本使用

一、概念 1.1 Compose优势 由一个个可以组合的Composable函数拼成界面&#xff0c;方便维护和复用。布局模型不允许多次测量&#xff0c;提升了性能。Compose可以和View互操作&#xff08;相互包含对方&#xff09;。 1.2 声明式UI APP展示的数据绝大多数不是静态数据而是会…