汇编语言笔记-ARM架构基本寄存器

2023-11-13

寄存器组

       Cortex-M3和Cortex-M4处理器(ARM架构)用于数据处理与控制的寄存器组中有16个寄存器,其中13个(R0 ~ R12)为通用目的寄存器,另外三个具有特殊用途:
在这里插入图片描述

1.R0 ~ R12

       寄存器R0 ~ R12为通用目的寄存器,其中前8个(R0 ~ R7)也被称作低寄存器,由于指令中可用的空间有限,许多16位指令只能访问低寄存器。而其它寄存器(R8 ~ R12)被称为高寄存器,可用于32位指令和部分16位指令,如MOV。

R0 ~ R12的初始值是未定义的。

2.R13

       R13为栈指针(SP),设置该指针的值后可通过PUSH和POP指令访问栈。

       物理上存在两个栈指针:
       1.主栈指针(MSP,有些ARM文献也称其为SP_main)为默认的栈指针,在复位后或处理器处于处理模式时该指针被处理器选择使用。
       2.进程栈指针(PSP,有些ARM文献也称其为SP_ process),只用于线程模式。

       栈指针的选择由特殊寄存器CONTROL决定。对于一般的程序,这两个寄存器(即MSP和PSP两个寄存器)只有一个可见。
       MSP和PSP都是32位寄存器,但最低两位固定为0。对于 ARM Cortex-M处理器,PUSH和POP指令总是32位的,栈操作的地址也必须对齐到32位的字边界上。

大多情况下,若不需要使用嵌入式OS则没必要使用PSP。许多简单的应用可以完全依赖MSP。一般在用到嵌入式OS时才会使用PSP,此时OS内核同应用任务的栈是相互独立的。PSP的初始值未定义,而MSP的初始值则需要在复位流程中从存储器的第一个字中取出。

3.R14

       R14为链接寄存器(LR),用于保存函数或子程序调用时返回地址。
       在函数或子程序结束时,程序将LR的数值加载至程序计数器(PC)中返回调用程序处并继续执行(也就是跳转回上层函数)。
       当执行了函数或子程序调用后,LR的数值会自动更新。若某函数调用另外一个函数或子程序,则需要将LR的数值保存在栈中,否则,函数执行后,LR的当前值会丢失(函数嵌套必须将对应的上层函数地址保存在栈中)。
       在异常处理期间,LR自动更新为特殊的EXC_RETURN(异常返回)数值,以在异常处理结束时触发异常返回。

4.R15

       R15为程序计数器(PC),可读写寄存器,读操作返回当前指令地址加4(由于设计的流水线特性及同ARM7TDMI处理器兼容的需要)。写操作(例如,使用数据传输/处理指令)产生程序跳转。
       由于指令必须对齐到长度(半字或字),PC的最低位(LSB)为0。但使用部分跳转/读存储器指令更新PC时,需要将PC值的LSB置1表示 Thumb状态,否则就会由于试图使用不支持的ARM指令(如ARM7TDMI中的32位ARM指令)而触发错误异常。高级编程语言(包括C和C+)编译器会自动将跳转目标的LSB置位。
       多数情况下,跳转和调用由专门的指令实现。访问位于程序存储器中的字符数据时,PC的数值非常有用,因此存储器读操作经常将PC作为基地址寄存器,并通过指令中的立即数生成偏移地址。

多数汇编工访问寄存器组中的寄存器时可以使用多种名称。一些汇编工具如ARM汇编(被DS5 Professional和 Keil MDK-ARM支持)可以使用大写、小写或者大小写混合,如下表所示:
在这里插入图片描述

特殊寄存器

       特殊寄存器未经过存储器映射,可以使用MSR和MRS等特殊寄存器访问指令来进行访问:

MRS <reg>,<special_reg>    ;将特殊寄存器读入寄存器
MSR <special_reg>,<reg>    ;写入特殊寄存器

       CMSIS-Core(为Cortex-M处理器核和外设定义的应用程序接口API)提供了几个用于访问特殊寄存器的函数。

不要混淆特殊寄存器和其他微控制器架构中的“特殊功能寄存器(SFR)”,SFR一般指的是用于I/O控制的寄存器

程序状态寄存器(xPSR)

       程序状态寄存器包括以下三个状态寄存器:

  • 应用PSR(APSR)
  • 执行PSR(EPSR)
  • 中断PSR(IPSR)

       三个寄存器各个功能位为:
在这里插入图片描述
       各个位的作用如下表所示:
在这里插入图片描述

注意,APSR和EPSR的一些位域在ARMv6-M架构(如 Cortex-M0)中不可用,且与ARM7TDMI等经典ARM处理器之间存在很大的差异。

       这三个寄存器可以通过一个组合寄存器访问,该寄存器在有些文献中被称作xPSR,ARM汇编器访问xPSR时通过“PSR”访问:

MRS R0, PSR   ;读组合程序状态字
MSR PSR, R0   ;写组合程序状态字

注意,此时组合寄存器为三个寄存器的有效位叠合,如下图所示:
在这里插入图片描述

       同时,也可以单独访问某个PSR:

MRS R0, APSR   ;将标志状态读入R0
MRS R0, IPSR   ;读取异常/中断状态
MSR APSR, R0   ;写标志状态

无法使用MRS(读出为0)或MSR直接访问EPSR。
IPSR为只读寄存器。

中断/异常屏蔽寄存器

名 字 功能描述
PRIMASK 1位宽寄存器。置位后关闭NMI(不可屏蔽中断和HardFault外的所有可屏蔽异常/中断。
FAULTMASK 1位宽寄存器。置位后只有NMI可以响应(相比于PRIMASK,可屏蔽的中断/异常多了HardFault)。
BASEPRI 根据优先级屏蔽中断/异常,该寄存器最多有9位(由设计实现的优先级位数决定)。该寄存器定义了被屏蔽优先级的阈值。当它被设置为某个值后,所有优先级号大于等于此值的中断都被关(注意:优先级号越大,优先级越低);若设置成0,则不关断任何中断。

注意:FAULTMASK和BASEPRI寄存器在ARMv6-M中不存在(如Cortex-M0)。

只有特权状态才可以操作三个寄存器(非特权状态下的写操作会被忽略,读操作返回0)。三个寄存器默认值为0,即屏蔽(禁止异常/中断)不起作用。

       使用MRS/MSR指令访问这三个寄存器,比如:

  MRS    R0, BASEPRI            ;将BASEPRI寄存器的值写入R0
  MSR    BASEPRI, R0            ;将R0的值写入BASEPRI寄存器

       可通过CSP(修改处理器状态)指令快速设置中断/异常的开关:

  CPSID    I    ;PRIMASK=1,关中断
  CPSIE    I    ;PRIMASK=0,开中断
  CPSID    F    ;FAULTMASK=1,关异常    
  CPSIE    F    ;FAULTMASK=0,开异常

CONTROL寄存器

       Cortex-M3、M4及的CONTROL寄存器如下,其中:

  • nPRIV在Cortex-M0中不存在,在 Cortex-M0+中可选
  • 具有浮点单元的Cortex-M4处理器的CONTROL寄存器中有1位表示当前是否使用浮点单元。
    在这里插入图片描述

       各个位的解释如下:

描述
nPRIV 用于定义线程模式中的特权等级:
0(默认):处于线程模式模式中的特权等级
1:处于线程模式模式中的非特权等级
SPSEL 用于定义栈指针的选择:
0(默认):线程模式使用主栈指针(MSP)
1:线程模式使用进程栈指针
处理模式下该位始终为0,且无法写入
FPCA 只存在于具有浮点单元的Cortex-M4中。异常处理机制通过该位确定异常产生时浮点单元相应寄存器是否需要保存。
0:当前的上下文不使用浮点指令
1:当前的上下文使用浮点指令(此时产生异常自动保存相应浮点寄存器)。

该寄存器复位后默认为0

只有特权状态才能修改(写操作)CONTROI寄存器。(读操作则不需要特权状态)

       同样的,使用MRS/MSR指令访问该寄存器:

  MRS    R0, CONTROL            ;将CONTROL寄存器的值写入R0
  MSR    CONTROL, R0            ;将R0的值写入CONTROL寄存器

浮点寄存器

1.S0 ~ S31和D0 ~ D15

       S0 ~ S31(S)都为32位寄存器,可通过浮点指令或利用符号D0 ~ D15(D代表双字/双精度)成对访问。
       例如,S0和S1成对组成D0,而S2和S3则成对组成D1。

浮点状态和控制寄存器(FPSCR)

       FPSCR寄存器用于定义浮点运算动作并提供浮点运算结果的状态信息,其位域及各个位的描述如下所示:
在这里插入图片描述

描述
N 负标志(由浮点比较运算更新)
Z 零标志(由浮点比较运算更新)
C 进位/借位标志(由浮点比较运算更新)
V 溢出标志(由浮点比较运算更新)
AHP 交替半精度控制位:
0:IEEE半精度格式(默认)
1:交替半精度格式
DN 默认NaN(非数值)模式控制位:
0:NaN操作数会变为浮点运算的输出(默认)
1:任何涉及一个或多个NaN的运算会返回默认的NaN
FZ 清零模式控制位:
0:清零模式禁止(默认)(符合IEE754标准)
1:清零模式使能
RMode 舍入模式控制位,表示的舍入模式基本上适用于所有的浮点指令:
00:最近舍入(RN)模式(默认)
01:正无穷舍入(RP)模式
10:负无穷舍入(RM)模式
11:向零舍入(RZ)模式
IDC 输入非正常累积异常位(结果未在正常数值范围内)
IXC 不精确的累积异常位
UFC 下溢累积异常位
OFC 溢出累积异常位
DZC 被零除累积异常位
IOC 非法操作累积异常位

上述的6个异常位在浮点异常产生时置位,写0则将其清除

浮点单元控制寄存器(经存储器映射)

       暂略…

注意

       ARM架构具有两种状态:ARM状态和Thumb状态,其中Cortex-M3和M4只能使用Thumb状态,而在该状态下部分寄存器的访问是有限制的:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

汇编语言笔记-ARM架构基本寄存器 的相关文章

  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站
  • 用于 RHEL 的 gdb-multiarch

    我正在尝试寻找方法来运行gdb 多架构RHEL 中的命令 我已经安装了用于 ARM 处理的 QEMU 模拟器 我想安装GDB进行调试 我能够安装GDB 多体系结构在 Ubuntu 中运行命令成功 sudo apt get GDB multi
  • GCC ARM 汇编预处理器宏

    我正在尝试使用汇编 ARM 宏进行定点乘法 define MULT a b asm volatile SMULL r2 r3 0 1 n t ADD r2 r2 0x8000 n t ADC r3 r3 0 n t MOV 0 r2 ASR
  • 读取和打印手臂组件中的字符串

    我正在使用 ARMSim 刚刚开始学习汇编 所以如果我看起来一无所知 请原谅我 但我正在尝试从输入文件中读取字符串 然后将其打印到输出屏幕 到目前为止我有 equ SWI Open 0x66 open a file equ SWI Clos
  • 如何在 Android 设备上运行 VS Code [重复]

    这个问题在这里已经有答案了 我有 Galaxy Tab S6 它具有替代笔记本电脑的很酷的功能 例如连接鼠标和键盘 但不幸的是它运行 Android 操作系统 并且没有很多开发应用程序可用于 Android 所以我想是否有一个选项可以在至少
  • ARM + gcc:不要使用一大块 .rodata 部分

    我想使用 gcc 编译一个程序 并针对 ARM 处理器进行链接时间优化 当我在没有 LTO 的情况下编译时 系统会被编译 当我启用 LTO 时 使用 flto 我收到以下汇编错误 错误 无效的文字常量 池需要更近 环顾网络 我发现这与我系统
  • 了解 ctags 文件格式

    我使用 Exhuberant ctags 来索引我的 c 项目中的所有标签 c project 是 Cortex M7 微控制器的嵌入式软件 结果是一个标签文件 我正在尝试阅读该文件并理解所写的内容 根据我找到的 ctags 和 Exhub
  • 基于 Windows 8 ARM 的平板电脑上的 VB6

    随着 Windows 8 将支持 VB6 我的问题是 Microsoft 是否在任何地方表示 是或否 VB6 应用程序将在基于 ARM 的平板电脑上运行 如果没有 是否有任何 ARM 模拟器 以便我们可以在 Windows 8 ARM 平板
  • 使用 NEON 优化 Cortex-A8 颜色转换

    我目前正在执行颜色转换例程 以便从 YUY2 转换为 NV12 我有一个相当快的函数 但没有我预期的那么快 主要是由于缓存未命中 void convert hd uint8 t orig uint8 t result uint32 t wi
  • Qemu flash 启动不起作用

    我有一本相当旧的 2009 年出版 嵌入式 ARM Linux 书 其中使用u boot and qemu 的用法qemu与u boot书中对二进制的解释如下 qemu system arm M connex pflash u boot b
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • iPhone 3GS 上的 ARM 与 Thumb 性能比较,非浮点代码

    我想知道是否有人有关于 iPhone 3GS 上 ARM 与 Thumb 代码性能的硬性数据 特别是对于非浮点 VFP 或 NEON 代码 我知道 Thumb 模式下的浮点性能问题 更大的 ARM 指令的额外代码大小是否会在某个时刻成为性能
  • 需要一些建议来开始在 ARM(使用 Linux)平台上编程

    我 也许 很快就会在托管 Linux 发行版的 ARM 平台上工作 我不知道哪个发行版 我知道该项目涉及视频流 但我无法告诉你更多信息 其实我只收到通知 还没见到任何人 我从来没有在这样的平台上工作过 所以我的想法是在项目开始之前进行测试
  • .ko 文件是如何构建的

    我正在尝试将我自己的驱动程序移植到Beagle 板 xm arm cortex A8 在移植时我试图弄清楚如何 ko文件实际构建 在我们的Makefile我们只有一个命令来构建 o file 怎样是一个 ko文件已建立 使用Linux 2
  • 直接写入 ARM Cortex A8 分支预测器中的全局历史缓冲区 (GHB) 或 BTB?

    我有兴趣直接修改 Cortex A8 上的 BTB 分支目标缓冲区 和 GHB 的内容 ARM 手册上有这样的内容 要在指令端 GHB 数组中写入一项 例如 LDR R0 0x3333AAAA MCR p15 0 R0 c15 c1 0 M
  • ARM 汇编:从 STDIN 获取字符串

    我目前正在学习 CS 课程 我们刚刚开始在 Raspberry Pi 上使用 ARM Assembly 事实证明这相当困难 想知道是否有人可以提供帮助 我当前的任务是从 stdin 获取一个字符串 使用 scanf 并计算其中的字符数 然后
  • 使用arm-linux-gnueabi-gcc为Android交叉编译静态C hello world

    我想使用 arm linux gnueabi gcc 从 C 构建静态 hello world 而不是使用 NDK 独立工具链或 Codesourcery 在Ubuntu中 我做了以下事情 sudo apt get install gcc
  • Linux 内核使用的设备树文件 (dtb) 可视化工具? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以图形化表示Linux内核中使用的硬件设备树的工具 我正在尝试了解特定 Arm 芯片组
  • 2022年Android CPU架构分布(armeabi-v7a vs arm64-v8a)

    有没有关于 2022 年 Android 设备上的架构使用情况的官方信息 我有一个支持armeabi v7a 和arm64 v8a 的应用程序 我想要放弃对armeabi v7a的支持并且仅支持 64 位设备 arm64 v8a 但我找不到
  • 尝试了解 ARM 二进制映像中的加载内存地址 (LMA) 和二进制文件偏移量

    我在一家ARM 皮质 M4 STM32F4xxxx 我试图了解二进制文件 elf and bin 在内存中构建并闪存 特别是关于内存位置 具体来说 我不明白的是LMA从实际的二进制文件偏移量进行 翻译 让我用一个例子来解释一下 我有一个 e

随机推荐

  • Python数据分析——上海市二手房价格分析

    自学数据分析与机器学习已有两月 近期房价问题引人深思 即兴做个上海市房价的数据分析小项目 上网一查上海市新楼盘价格 高的不忍直视 索性退而求其次 分析上海二手房的价格 一 数据收集 常规做法是编写网络爬虫程序 爬取相关网站的数据信息 捷径是
  • 如何把glb格式模型gltf格式模型导入3dmax和C4D,U3D,UE4这些主流软件中

    咱有时候去glbxz com添加链接描述 官网下载免费glb格式模型 gltf模型下载时候是没有通用格式 例如fbx obj 这个时候3dmax和C4D直接打开导入是不行的 也可以制作glb模型 扣扣 424081801 这个时候 咱们用
  • AI工具汇总

    大家好 我是可夫小子 关注AIGC 读书和自媒体 ChatGPT已经火了这么久 我也写不了少玩ChatGPT的方法 昨天OpenAI又推出了苹果手机的APP 我也介绍下载和安装的攻略 但根据读者反馈 仍然还是有许多同学没能用上 今天我就把我
  • VS2015远程编译Linux项目

    用VS2015开发Linux程序详细教程 配置篇 crazytea的博客 CSDN博客 linux 程序开发VS2015推出了跨平台开发 其中包括了对Linux程序开发的支持 最近刚好需要开发Linux程序 对其进行了一些研究 首先介绍下涉
  • redis的安装与配置

    第一章 redis 1 1redis的概述 1 2关系型数据库与非关系数据库 1 3关系型数据库和非关系型数据库区别 1 4redis优点与缺点 第二章redis的安装 2 1 YUM安装 2 2下载编译安装 2 2 1关闭防火墙 2 2
  • element左侧导航栏el-menu,菜单栏文字超出不折行问题

    在CSS样式中加上这些样式就可以了 el submenu title display flex align items center el submenu title span white space normal word break b
  • C# 面向对象05 StringBuilder的用法

    好处 相比普通的 string处理 提高了字符串的处理速度 注意点 使用时需要使用对象的方式 StringBuilder world new StringBuilder using System using System Diagnosti
  • SimpleDateFormat模式字符串格式

    SimpleDateFormat模式字符串 new SimpleDateFormat String parm parm为一个字符串 表示格式 时间模式 字母 时间元素 表示 示例 y 年 Year 1996 96 M 年中的月份 Month
  • PyTorch基础之模型保存与重载模块、可视化模块讲解(附源码)

    训练模型时 在众多训练好的模型中会有几个较好的模型 我们希望储存这些模型对应的参数值 避免后续难以训练出更好的结果 同时也方便我们复现这些模型 用于之后的研究 PyTorch提供了模型的保存与重载模块 包括torch save 和torch
  • jvm内存模型与垃圾回收(下)

    上篇地址 jvm内存模型与垃圾回收 上 1 垃圾回收相关算法 标记清除 标记整理 复制 这三个看上面的文章 1 1 分代收集算法 将不同生命周期的对象采用不同的收集方式 以便提高回收效率 一般是将Java堆分为新生代和老年代 这样可以根据各
  • 接口与实现

    public interface Computable 接口体包含常量和抽象方法 没有普通方法 int MAX 46 常量 int f int x 抽象方法 默认权限friendly public class China implement
  • 【C++】使用Windows操作系统的API在控制台输出绿色的文本

    2023年8月21日 周一下午 include
  • linux桌面远程控制,在LINUX下远程控制WIN桌面

    rdesktop 是个在veket下访问视窗系统 远程桌面的客户端程式 当前 rdesktop 所支持的 视窗系统 系列版本包括 NT 2000 XP 和2003 通过使用 rdesktop 所实现的远程桌面协议 RDP 你能在veket系
  • 企业微信群机器人开发

    准备工作 已经注册了有效的企业微信账号 并且在客户端上已经登录 现有或者新建有效的包含多名企业微信成员的群聊 创建群聊机器人 右键群聊 gt 管理聊天信息 gt 添加群机器人 使用群机器人 在终端某个群组添加机器人之后 创建者可以在机器人详
  • 【单片机笔记】STM32+ESP8266通过AT指令WIFI连接阿里云MQTT服务器

    上一篇使用USB转串口的方式通过ESP8266wifi模块的方式成功连接上了阿里云 现在就要通过单片机来替换电脑上位机了 这样单片机自动的去调用并发送串口数据更加方便 也更加符合一个产品的开发 板载的传感器有NTC温度 光强 这两个主要用来
  • 音频采样率、采样深度、占用字节数浅析

    1 从一个问题来看 16K采样率 16bit采样深度 20ms的数据共占用多少字节 想要解这个问题 首先就要明白采样率是什么 它的单位是什么 采样率 就是指音频在每秒的采样次数 采样多少个点 单位是赫兹 hz 在这里 尤其不要与比特率 bp
  • wxc-icon使用

  • Vue3中的computed函数详解

    计算属性是Vue中常用的一种方式 主要用于在模板中放置逻辑计算 方便开发者进行数据操作和展示 在Vue3中 计算属性依然是非常重要的一种功能 而computed函数则更加的方便计算属性的使用 本文将对Vue3中的computed函数进行详细
  • 修改约束(注意是否存在字段名的情况)

    添加字段名时添加约束 语法 alter table 表名 add 字段名 数据类型 约束名 注意 这个方法会让表中让所有address都变成 中国 表达有点不清晰 自己去试试此方法和其他方法就知道了 例如 alter table emp a
  • 汇编语言笔记-ARM架构基本寄存器

    文章目录 寄存器组 1 R0 R12 2 R13 3 R14 4 R15 特殊寄存器 程序状态寄存器 xPSR 中断 异常屏蔽寄存器 CONTROL寄存器 浮点寄存器 1 S0 S31和D0 D15 浮点状态和控制寄存器 FPSCR 浮点单