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

news2025/1/12 6:55:14

目录

    • 指令集
      • 汇编语言基础
        • 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]

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

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

相关文章

PHP小白搭建Kafka环境以及初步使用rdkafka

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、安装java&#xff08;Kafka必须安装java&#xff0c;因为kafka依赖java核心&#xff09;二、安装以及配置Kafka、zookeeper1.下载Kafka&#xff08;无需下载…

从零开始配置Jenkins与GitLab集成:一步步实现持续集成

在软件开发中&#xff0c;持续集成是确保高效协作和可靠交付的核心实践。以下是在CentOS上安装配置Jenkins与GitLab集成的详细步骤&#xff1a; 1.安装JDK 解压JDK安装包并设置环境变量&#xff1a; JDK下载网址 Java Downloads | Oracle 台灣 tar zxvf jdk-11.0.5_linux-x64_b…

在Linux中使用gcc/g++编译代码

gcc/g 1.方法速记2.具体过程2.1 预处理阶段2.2 编译阶段2.3 汇编阶段2.4链接阶段2.4.1 链接的细节 gcc和g的操作一样&#xff0c;g的方法就仅需把gcc换成g即可。 1.方法速记 直接编译语法&#xff1a;将text.c文件或者text.cpp文件直接编译成text文件。 gcc text.c -o text /…

微软 Visual Studio 现已内置 Markdown 编辑器,可直接修改预览 .md 文件

Visual Studio Code V1.66.0 中文版 大小&#xff1a;75.30 MB类别&#xff1a;文字处理 本地下载 Markdown 是一种轻量级标记语言&#xff0c;当开发者想要格式化代码但又不想牺牲易读性时&#xff0c;Markdown 是一个很好的解决方案&#xff0c;比如 GitHub 就使用 Markdo…

公司阿里云服务器被暴力破解

公司阿里云服务器被暴力破解&#xff1f; 公司云服务器跑了3年了&#xff0c;从来没改过密码&#xff0c;而且基本所有服务器密码都是同一个&#xff0c;只把公司IP添加白名单了。&#xff08;确实不严谨&#xff0c;但至少限制了连接源&#xff09; 突然就收到阿里云短信提醒…

ppt如何转pdf文档?用这个方法可将ppt转pdf

在现代社会中&#xff0c;PPT(幻灯片)已成为一种常见的演示工具&#xff0c;被广泛应用于学术、商务、培训等领域。然而&#xff0c;PPT文件的使用和分享存在一些问题&#xff0c;例如文件格式不兼容、内容修改易被篡改等。为了解决这些问题&#xff0c;将PPT转换为PDF格式已成…

【一文读懂】 Java并发 - 锁升级原理

要明白锁的原理&#xff0c;首先要知道对象头 Java对象头 在Java中&#xff0c;一个对象一般由两部分组成 &#xff1a;1、对象头 &#xff1b; 2、对象的成员变量信息 在32位的虚拟机中&#xff1a; &#xff08;1&#xff09;普通对象的对象头长度64bit&#xff08;8字节&…

Javascript 编写一个简单的聊天机器人

在本 Web 开发教程中&#xff0c;我们将了解如何使用 HTML、CSS 和 vanilla JavaScript 创建基本的聊天机器人。本练习侧重于 JS 基础知识&#xff0c;而不是任何类型的人工智能 &#xff08;AI&#xff09;。为了使该过程更简单&#xff0c;更易于学习&#xff0c;我没有使用任…

ffmpeg windows环境MinGW+msys2编译so库

一、安装MinGW 1.1、下载MinGW 1.2、下载完成后&#xff0c;会得到一个名为 mingw-get-setup.exe 的安装包&#xff0c;双击打开它&#xff0c;可以看到如下的对话框&#xff1a; 1.3、直接点击“Install”&#xff0c;进入下面的对话框 1.4、可根据自己操作系统的实际情况&am…

数据库MySQL中left join多个条件下的执行

1 基础表 创建表A 表B create table testA(id int, name varchar(10)); create table testB(id int, name varchar(10)); 2 插入数据 insert into testA values(1,zhangssa),(2,lisi),(3,wangwu) insert into testB values(2,zhangssa2),(3,lisi2),(4,wangwu4) 3 left joi…

WPF自定义命令及属性改变处理

1、项目建构 2、自定义命令 namespace WpfDemo.Base {public class MyCommand : ICommand{Action executeAction;public MyCommand(Action action){executeAction action;}public event EventHandler? CanExecuteChanged;public bool CanExecute(object? parameter){retu…

ssm会员管理系统源码和论文

ssm会员管理系统源码和论文062 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#x…

36k字从Attention讲解Transformer及其在Vision中的应用(pytorch版)

文章目录 0.卷积操作1.注意力1.1 注意力概述(Attention)1.1.1 Encoder-Decoder1.1.2 查询、键和值1.1.3 注意力汇聚: Nadaraya-Watson 核回归1.2 注意力评分函数1.2.1 加性注意力1.2.2 缩放点积注意力1.3 自注意力(Self-Attention)1.3.1 自注意力的定义和计算1.3.2 自注意…

邀请函 | 区块链如何助力建设“健康中国”?ESG系列研讨会“医疗”专场来袭!

党的十九大报告指出&#xff0c;要全面实施健康中国战略&#xff0c;为人民群众提供全方位全周期健康服务。今年7月&#xff0c;国家卫生健康委等六部门联合印发了《深化医药卫生体制改革2023年下半年重点工作任务》&#xff0c;明确指出要开展全国医疗卫生机构信息互通共享三年…

基于 vue2 发布 npm包

背景&#xff1a;组件化开发需要&#xff0c;走了一遍发布npm包的过程&#xff0c;采用很简单的模式实现包的发布流程&#xff0c;记录如下。 项目参考&#xff1a;基于vue的时间播放器组件&#xff0c;并发布到npm_timeplay.js_xmy_wh的博客-CSDN博客 1、项目初始化 首先&a…

AKM10-58C大电流TVS二极管参数:58V 10000A

东沃&#xff08;DOWO&#xff09;AKM10-76C是什么二极管&#xff1f; 东沃生产AKM10-76C大电流TVS二极管吗&#xff1f;有现货吗&#xff1f; 除了AKM10-76C外&#xff0c;东沃&#xff08;DOWO&#xff09;生产的贴片大电流二极管还有哪些型号&#xff1f; …… AKM10-76C是厂…

VMware 新装 CentOS 7 连不上网络的【解决方法】

文章目录 1&#xff09;虚拟机设置2&#xff09;虚拟网络编辑器3&#xff09;Linux 网卡设置4&#xff09;检查网络状态参考资料&#xff1a; 安装好虚拟机之后&#xff0c;将来会在虚拟机内的系统中安装各种应用&#xff0c;如果虚拟机内的系统连不上网&#xff0c;则无从谈起…

PythonJS逆向解密——实现翻译软件+语音播报

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: python 3.8 pycharm 模块使用: requests --> pip install requests execjs --> pip install PyExecJS ttkbootstrap --> pip install ttkbootstrap pyttsx3 --> pip install pyttsx3 第三…

interview2-框架篇

一、Spring篇 1、Spring &#xff08;1&#xff09;Bean线程安全问题 不是线程安全的。Spring框架中有一个Scope注解&#xff0c;默认的值就是singleton&#xff0c;单例的。因为一般在spring的bean的中都是注入无状态的对象&#xff0c;没有线程安全问题&#xff0c;如果在b…

【Focal Loss】解决类别不平衡问题,增加对困难样本的挖掘

Focal Loss是在交叉熵损失函数的基础上增加了一个平衡因子 α \alpha α和一个聚焦因子 γ \gamma γ&#xff0c;分别用来调节不同类别样本的权重以及难分样本和易分样本之间的权重一个样本的交叉熵损失函数如下&#xff1a; p t p_t pt​表示将该样本分类为t的概率一个样本的…