ARM寄存器

news2024/12/28 19:01:45

1.ARM 工作状态 

arm 支持大小端(默认小端 ,大端格式:高字节在低地址,低字节在高地址;小端格式:高字节在高地址,低字节在低地址;)、arm支持16bit thumb指令和32bit arm指令(默认arm指令),thumb2指令是16位与32位共存的。

 2.ARM 工作工作模式

不同 工作模式 下 可访问的寄存器和指令集有差异,长度不一样,或者是功能不一样,主要用于区分运行权限保护系统(由运行异常、中断或者软件主动触发切换模式)
工作模式分类(7种):

1、用户模式(Usr):用于正常执行程序;

2、快速中断模式(FIQ):用于高速数据传输;

3、外部中断模式(IRQ):用于通常的中断处理;

4、管理模式(svc):操作系统使用的保护模式;

5、数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储以及存储保护;

6、系统模式(sys):运行具有特权的操作系统任务;

7、未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件。

注意:不是所有ARM架构的产品都是7种工作模式的

2.1.Arm的工作模式切换有两种方法:

被动切换:在arm运行的时候产生一些异常或者中断来自动进行模式切换

主动切换:通过软件改变,即软件设置寄存器来经行arm的模式切换,应为arm的工作模式都是可以通过相应寄存器的赋值来切换的。

Tips:当处理器运行在用户模式下,某些被保护的系统资源是不能被访问的

除用户模式外,其余6种工作模式都属于特权模式;

特权模式中除了系统模式以外的其余5种模式称为异常模式

大多数程序运行于用户模式;

进入特权模式是为了处理中断、异常、或者访问被保护的系统资源;-----保护机制

 

 3.ARM 指令和 THUMB指令的关系:


THUMB 指令是 ARM 指令的子集,可以相互调用,只要遵循一定的调用规则
Thumb 指令 与 ARM 指令 的时间效率和空间效率关系为:
        存储空间约为ARM代码的60%~70%
        指令数比ARM代码多约30%~40%
        存储器为32位时ARM代码比Thumb代码快约40%
        存储器为16位时Thumb比ARM代码快约40~50%
        使用Thumb代码,存储器的功耗会降低约30%

注:当处理器处于Thumb状态时发生异常(如IRQ、FIQ、Undef、Abort、SWI等),则异常处理返回时,自动切换到 Thumb 状态ARM 处理器总是 从 ARM 工作状态开始执行的。因此,如果要在调试器重运行 Thumb 程序,必须为 该 Thumb 程序添加一个 ARM程序头,然后再切换到Thumb工作状态,调用该 Thumb程序。

3.1.Thumb与ARM状态切换

在实际系统中,内核状态需要经常的切换(Interworkong)来满足系统性能要求。具体的切换是通过 Branch Exchange,即 BX 指令来实现的。指令格式为:

  1. Thumb 工作状态 BX Rn

  2. ARM 工作状态 BX Rn

其中 Rn 可以是寄存器 R0 ~ R15 中的任意一个。指令可以通过将寄存器Rn的内容,拷贝到程序计数器 PC 来完成在 4GB地址空间中的绝对跳转,如果操作数寄存器的状态位 Bit0 = 0,则进入 ARM 工作状态;如果 Bit0 = 1,则进入 Thumb 工作状态。

ARM 处理器在两种工作状态之间可以切换,切换不影响处理器的模式或寄存器的内容。

  • (1) 当操作数寄存器的状态位 ( 位[0] ) 为 1 时,执行 BX 指令进入 Thumb 状态。如果处理器在 Thumb 状态进入异常,则当异常处理 ( IRQ、FIQ、Undef、Abort 和 SWI ) 返回时,自动转换到 Thumb 状态。
  • (2) 当操作数寄存器的状态位 ( 位[0] ) 为 0 时,执行 BX 指令进入ARM状态,处理器进行异常处理 ( IRQ、FIQ、Reset、Undef、Abort 和 SWI )。在此情况下,把PC放入异常模式链接寄存器中。从异常向量地址开始执行也可以进入ARM状态。

 4.寄存器

 

Arm 处理器总共有 37 个寄存器,其可以分为以下 2 类:

  • 1.  通用寄存器( 31 个)
            1.  不分组寄存器( R0 — R7 ),共 8 个。
            2.  分组寄存器( R8 — R14 )共22个(R8-R12,五个,一共5*2=10,R13-14,两个,一共是2*16=12,总共10+12=22个)
  •         3.  PC 指针( R15 ),共1个
  • 2.  程序状态寄存器( 6个  )
            1.  CPSR( 1个 )    
            2.  SPSR( 5个 )

看图就可以算寄存器数量了,要看ARM指令的,不要看Thumb指令的。 

所谓 不分组 就是在七种模式下的任意一种模式都访问同一个物理寄存器地址。就是不分组寄存器没有特权模式,任意一种模式都可以使用未分组寄存器。

 5.ARM 框架 的 寄存器 解析

未分组寄存器:R0 - R7  R15  cpsr,cpu 在任何模式下看到的 这几个寄存器都是一样的。在所有的运行模式下,未分组寄存器都指向同一个物理寄存器,他们未被系统用作特殊的用途,因此,在中断或异常处理进行运行模式转换时,由于不同的处理器运行模式均使用相同的物理寄存器,可能会造成寄存器中数据的破坏,这一点在进行程序设计时应引起注意。分组寄存器 R8 - R14 在不同模式下看到的这几个寄存器是不一样的。

 5.1.寄存器功能说明

  • R0 - R12   存取数据,临时数据
  • R13:sp 用于指向不同模式的栈顶。栈,每种模式都需要开辟一块内存,用于在该模式下 函数调用,临时分配的数据存放在此处。Stack Pointer (SP),栈指针寄存器,该寄存器始终保存着一个指向栈顶的值,值得注意的地方;
    SP寄存器的Bit[1:0](最低两位)始终为0,因此这个寄存器是按照字对齐的,也就是四个字节;

    M3有两个堆栈指针,并且同一时刻只能使用其中的一个;
    主堆栈指针(MSP/SP_main):复位后默认使用的堆栈指针寄存器,用于操作系统内核以及异常处理例程(包括中断服务例程);
    进程堆栈指针(PSP/SP_process):由用户的应用程序代码使用。
    寄存器R13通常被用作堆栈指针寄存器,另外究竟使用哪个寄存器,由CPU的控制寄存器来决定;

    Handler mode :即系统发生异常(中断等)的情况会进入该模式,通常使用SP_main;
    Thread mode:用户程序正常运行时处于该模式,可以选择使用SP_main 或 SP_process;
    CPU的Configuration Control Register,如下图所示;。

  • R14 : lr 程序跳转的时候,返回到的地址就保存到此处
  • R15 :pc 要执行的下一条指令地址,就存放在此处,每次指令执行完,就自动+4
  • CPSR:程序状态寄存器。程序执行的时候,有很多临时标记位,结果是0 是否溢出,是否有借位,是否有 进位,当前cpu模式,
  • SPSR:用于模式切换,将切换前的 cpsr 保存到 新的模式的 spsr,模式切换回去的时候,再将spsr的内容还原到cpsr。

 5.1.1寄存器分组说明

1. 未分组寄存器 R0 ~ R7共 8 个。在所有的运行模式下都使用同一个物理寄存器,它们未被系统用作特殊的用途。

2. 分组寄存器 R8 ~ R12,R13 ~ R14
    R8 ~ R12:( 总共10个 )
        每次所访问的物理寄存器与处理器当前的运行模式有关,R8~R12:每个寄存器对应两个不同的物理寄存器
        当使用fiq模式时,访问寄存器R8_fiq~R12_fiq,当使用除fiq模式以外的其他模式时,访问寄存器R8_usr~R12_usr。
        其中 FIQ 模式有单独的一组 R8 ~ R12,共5个;(  FIQ ( 快速中断模式 ) 时访问寄存器 R8_fiq ~ R12_fiq )
        另外 6 种模式共用一组 R8 ~ R12,共5个;(当使用除 FIQ 模式以外的其他模式时,访问寄存器 R8 ~ R12)
                 
    R13 ~ R14:( 总共12个 )
        其中 USR 和 SYS 模式(表格的第一列)共用一组 R13 ~ R14 共2个,
        另外 5 种模式下各有独自的一组 R13 ~ R14,并采用以下记号来区分不同的物理寄存器,分别
        为 fiq、irq、svc、abt、und。共10个。( mode为以下几种之一:usr、fiq、irq、svc、abt、und。 )              

        i. R13 在 ARM 指令中常用作堆栈指针 SP
            特别注意:由于每一种模式都有自己的 R13,所以我们在自己初始化的时候 一般都要初始化每种模式下的R13,使其指向该运行模式的栈空间。       
        ii. R14 称为子程序链接寄存器 LR (Link Register)
            有两个特殊功能,

                一种是每一种模式下都可以用于 保存函数的返回地址
               另外就是异常处理后的返回地址,如中断处理之后的跳转

3. PC 指针( R15 )
    R15 用作程序计数器 ( PC ),对应一个物理寄存器,由于 ARM 体系结构采用了多级流水线技术
    对于 ARM 指令集而言,PC 总是指向当前指令的下两条指令的地址,可以通过向 pc 赋值,来控制程序跳转。即 PC 的值为当前指令的地址值加8个字节。(这里和我们正常学习的不一样,正常都是PC指向下一条指令,也就是地址值加4字节)。

4. CPSR (1 个 状态寄存器。CPSR 表示:当前程序状态寄存器 )-----重点

CPSR寄存器是32位寄存器。

  • 0 ~ 7   位 :  控制
  • 8 ~ 27  位:  保留
  • 28 ~ 31位:  条件标志

 所以我们只要研究控制位和条件位即可。

 

 

5. SPSR ( 5 个 备份状态寄存器 )

SPSR(备份的程序状态寄存器)

SPSR 除 usr、sys 外,对应用于异常保护的 CPSR 的备份,异常时,保存CPSR值,异常退出时,将该值恢复到CPSR,以保证程序的正常运行,每一中异常运行模式(除usr和sys)有各自的物理寄存器。

5.1.2.寄存器的作用

0 - r3   : 用作传入函数参数,传出函数返回值。在子程序调用之间,可以将 r0-r3 用于任何用途。被调用函数在返回之前不必恢复 r0-r3。如果调用函数需要再次使用 r0-r3 的内容,则它必须保留这些内容。

r4 - r11  : 被用来存放函数的局部变量。如果被调用函数使用了这些寄存器,它在返回之前必须恢复这些寄存器的值。

r12      :是内部调用暂时寄存器 ip。它在过程链接胶合代码(例如,交互操作胶合代码)中用于此角色。 在过程调用之间,可以将它用于任何用途。被调用函数在返回之前不必恢复 r12。

r13    :    是栈指针 sp。它不能用于任何其它用途。sp 中存放的值在退出被调用函数时必须与进入时的值相同。

r14   :     是链接寄存器 lr。如果您保存了返回地址,则可以在调用之间将 r14 用于其它用途,程序返回时要恢复

r15     :   是程序计数器 PC。它不能用于任何其它用途。

注意:在中断程序中,所有的寄存器都必须保护,编译器会自动保护 R4~R11

寄存器编号可选名字ATPCS寄存器用法
R0~R3A1~A4参数寄存器,在调用函数时,用来存放前4个函数参数和返回值,多出的存堆栈中。(易失的)
R4~R8V1~V5通用变量寄存器。(非易失性的)
R9V6 sb通用变量寄存器。在与读/写位置无关的编译情况下,用作基址寄存器。(非易失性的)
R10V7 sl通用变量寄存器。在使用堆栈边界检查的编译情况下,R10保存堆栈边界的地址。(非易失性的)
R11V8 fp通用变量寄存器。在使用结构指针的情况下,必须保存这个寄存器中调用函数的变量值。(非易失性的)
R12Ip通用临时过渡寄存器(易失的)
R13sp堆栈指针,指向满递减堆栈
R14lr链接寄存器,在函数调用时用以保存返回地址
R15pc程序计数器

5.1.3.小结

37个寄存器是指 通用寄存器 和一些 状态寄存器,这是 ARM 架构定义好的寄存器,事实上 ARMv7 已经不止这些寄存器了,37 个 寄存器是 ARMv6 以前的架构,典型的就是基于 ARMv4T 的 ARM9 有这么多寄存器,之后 ARM 引入了 TrustZone 以及虚拟化就又引入了一些 banked 寄存器。现在到了 ARMv8,通用寄存器又不一样了,具体可以看 ARM 的 spec。

 6.ARM 64 经常用到的汇编指令

MOV    X1,X0         ;将寄存器X0的值传送到寄存器X1
ADD    X0,X1,X2     ;寄存器X1和X2的值相加后传送到X0
SUB    X0,X1,X2     ;寄存器X1和X2的值相减后传送到X0
AND    X0,X0,#0xF    ; X0的值与0xF相位与后的值传送到X0
ORR    X0,X0,#9      ; X0的值与9相位或后的值传送到X0
EOR    X0,X0,#0xF    ; X0的值与0xF相异或后的值传送到X0
LDR    X5,[X6,#0x08]        ;X6寄存器加0x08的和的地址值内的数据传送到X5
STR X0, [SP, #0x8]         ;X0寄存器的数据传送到SP+0x8地址值指向的存储空间
STP  x29, x30, [sp, #0x10]    ;入栈指令
LDP  x29, x30, [sp, #0x10]    ;出栈指令
CBZ  ;比较(Compare),如果结果为零(Zero)就转移(只能跳到后面的指令)
CBNZ ;比较,如果结果非零(Non Zero)就转移(只能跳到后面的指令)
CMP  ;比较指令,相当于SUBS,影响程序状态寄存器CPSR 
B/BL  ;绝对跳转#imm, 返回地址保存到LR(X30)
RET   ;子程序返回指令,返回地址默认保存在LR(X30)

其中 MOV 指令只能用于寄存器之间传值,寄存器和内存之间传值通过 LDR 和 STR 。b 是跳转指令

阿里社区也有一个很不错的整理,这里附上链接。

【ARM】常用指令集-阿里云开发者社区 (aliyun.com) 

6.1.指令条件

ARM指令所有指令都是带有条件的,默认是AL即无条件执行,当指令带有默认条件时不需要明确写出。

操作码条件码助记符标志含义
0000EQZ=1相等
0001NE(Not Equal)Z=0不相等
0010CS/HS(Carry Set/High or Same)C=1无符号数大于或等于
0011CC/LO(Carry Clear/LOwer)C=0无符号数小于
0100MI(MInus)N=1负数
0101PL(PLus)N=0正数或零
0110VS(oVerflow set)V=1溢出
0111VC(oVerflow clear)V=0没有溢出
1000HI(HIgh)C=1,Z=0无符号数大于
1001LS(Lower or Same)C=0,Z=1无符号数小于或等于
1010GE(Greater or Equal)N=V有符号数大于或等于
1011LT(Less Than)N!=V有符号数小于
1100GT(Greater Than)Z=0,N=V有符号数大于
1101LE(Less or Equal)Z=1,N!=V有符号数小于或等于
1110AL任何无条件执行(默认)
1111NV任何从不执行

 参考链接:

ARM 寄存器 详解_擒贼先擒王的博客-CSDN博客_用于子程序或函数调用时保存返回地址、减少内存访问次数的寄存器是

【ARM】常用指令集-阿里云开发者社区 (aliyun.com) 

 

 

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

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

相关文章

景联文科技:探究人工智能在智慧医疗中的应用及作用|数据标注

智慧医疗中的人工智能具有难以想象的潜力。人工智能在智慧医疗中的未来从通过协助重复性工作到药物管理或药物创造的治疗计划设计开始,人工智能已经在多个医学领域发挥作用。更好地组织智慧医疗物流智慧医疗和医学领域的人工智能可以更好地组织患者路线或治疗计划&a…

RabbitMQ 队列参数

RabbitMQ 队列参数 RabbitMQ在申明队列的时候,可以指定一些参数: /*** Declare a queue* see com.rabbitmq.client.AMQP.Queue.Declare* see com.rabbitmq.client.AMQP.Queue.DeclareOk* param queue the name of the queue* param durable true if we…

内核源码解读之内存管理(10)percpu_page_set分析

文章目录背景数据结构pcp的初始化流程背景 Linux系统中0阶内存分配需求是最多的, 而且经常存在频繁分配释放的行为,如果每次都去伙伴系统中申请,会经常需要获取zone->lock锁住整个zone区域。随着CPU核心数的增加,伙伴系统锁竞…

jumpserver堡垒机配置https访问

官方文档:https://docs.jumpserver.org/zh/master/ Jumpserver部署关闭防火墙开放策略 按照需要开放端口即可 firewall-cmd --permanent --add-port22/tcp 开放22端口 firewall-cmd --permanent --add-port80/tcp 开放80端口 firewall-cmd --permanent --add-po…

ctfshow-信息搜集

web1 右键查看源码得到flag web2 禁用了右键,可以ctrlu查看源码得到flag web3 抓包得到flag web4 题目提示在robots中,可以用dirsearch 扫出来 访问robots.txt 再访问/flagishere.txt得到flag web5 题目提示源码泄露,再用dirsearch扫…

如何在Linux上安装文件同步工具:FreeFileSync

文件同步是最需要的功能之一,尤其是在共享文件时,不仅如此,它还可以很好地用于将数据与云存储同步。因此,如果您正在寻找一种可免费获得且易于在 Linux 上使用的工具,请不要错过本文。 在 Linux Mint 21 上安装 FreeF…

【数据结构】(牛客)链表中倒数第k个结点,(LeetCode)合并两个有序链表,(牛客)CM11 链表分割

目录 一、链表中倒数第k个结点 1、题目说明 2、题目解析 二、合并两个有序链表 1、题目说明 2、题目解析 三、CM11 链表分割 1、题目说明 2、题目解析 一、链表中倒数第k个结点 1、题目说明 题目链接:链表中倒数第k个结点 输入一个链表,输出该链表中倒…

U3D客户端框架(资源管理篇)之自动化打Assetbundle包管理器

一、AssetBundle介绍 AssetBundle是将资源使用Unity提供的一种用于存储资源的压缩格式打包后的集合,它可以存储任何一种Unity可以识别的资源,如模型,纹理图,音频,场景等资源。也可以加载开发者自定义的二进制文件。他…

CleanMyMacX4.12最新免费版苹果电脑系统优化清理软件

CleanMyMac X是一款Mac上优秀的系统清理工具,它可以帮助用户清理垃圾文件、清理缓存、清理日志文件、清理应用程序等,可以让Mac系统保持良好的运行状态,提高Mac的运行速度。CleanMyMac X还可以帮助用户清理垃圾文件、清理缓存、清理日志文件、…

PCB翘曲度标准是多少

PCB翘曲其实也是指电路板弯曲,是指原本平整的电路板,放置桌面时两端或中间出现在微微往上翘起,这种现象被业内人士称为PCB翘曲。 电路板翘曲度计算公式将电路板平放在桌面上,电路板的四个角着地,测量中间拱起的高度&am…

乐观的调优(插入排序希尔排序)

学习目标 写在前面 1.插入排序 2.插入排序实战 3.插入排序的实现 4.插入排序的效率 5.平均情况 6.希尔排序 7.希尔排序的实现 8.希尔排序的效率 9.总结 写在前面 之前我们衡量一个算法的效率时,都是着眼于它在最坏情况下需要多少步。原因很简单&#x…

PyQt6快速入门-开发环境搭建

PyQt6开发环境搭建 文章目录 PyQt6开发环境搭建1、软件安装2 、创建工程2.1 创建Qt工程2.2 创建Python工程2.3 PyQt6启动失败问题解决本文将介绍如何在Windows下创建PyQt6的开发环境。 1、软件安装 第一步,下载并安装Python环境 https://www.python.org/downloads/windows/或…

effective C++读书笔记3

目录 在资源管理中小心copy行为 在资源管理中提供对原始资源的访问 以独立语句将newed对象置入智能指针 这是effectiveC中第三章内容:资源管理 在资源管理中小心copy行为 不是所有资源都是heap-based,对那种资源而言,像auto_ptr和 tr1 :…

【C语言进阶】数据在内存的存储

作者:匿名者Unit 目录一.数据类型分类1.整形2.浮点型3.构造类型4.指针类型5.空类型二.整形的存储1.原、反、补码2.大小端存储三.浮点数的存储一.数据类型分类 根据不同的数据类型,在内存中的人存储方法也有所差异,所以我们先来介绍一下数据类型的分类。…

(二)uboot移植--从零开始自制linux掌上电脑(F1C200S)<嵌入式项目>

目录 一、前言 二、F1C200s上电启动顺序 三、前期准备 四、新建用户 五、交叉编译环境配置 六、uboot简介 七、uboot移植 🍏 uboot下载 🍏 uboot默认配置 🍏 uboot图形界面配置 🍏 uboot编译 🍏 烧录bin…

Python-变量和简单数据类型

目录 1. 字符串 1.1. 修改字符串大小写 1.2. 合并字符串 1.3. 制表符与换行符 1.4. 删除空白 2. 数字 2.1. 使用 2.2. 使用str函数避免类型错误 2.3. 注释 2.4. Python之禅 1. 字符串 1.1. 修改字符串大小写 首字母大写:name.title()全部大写&#xf…

基于DDAUNet的CT食管肿瘤分割

摘要 在CT图像中手动或自动描绘食道肿瘤是非常具有挑战性的。这是由于肿瘤与邻近组织的对比度低,食道的解剖结构变化,以及偶尔存在异物(如喂食管)。 本文提出了一种基于卷积神经网络的全自动端到端食管肿瘤,本文所提出的网络称为扩张密集注意力网络,利用每个密集块中的空…

VScode代码片段尝试

最近开始尝试强迫自己使用 VSCode,毕竟 Webstorm 用了很多年了,依赖性比较严重。但是,最近 Webstorm 越来越难搞到免费永久合法使用方式了。 遂转向 VSCode 。 不过 VSCode 需要调教,不像 Webstorm 那么集成度比较高&#xff0c…

CalDAV网络服务器Baikal

什么是 Baikal ? Baikal 是一个免费的开源自托管 CalDav 和 CardDav 服务器,适用于想要管理其数据并确保其数据是私有的用户。 Baikal和群晖套件中的 Synology Calendar 是类似的应用; 什么是 CalDav ? CalDav 是一种互联网标准和协议&…

Qt扫盲-QVector理论总结

QVector理论总结一、概述二、使用1. 声明初始化2. 获取元素和链表信息3. 常用操作4. 迭代Vector三、注意一、概述 QVector是Qt的泛型容器类之一。它将每一个元素存储在相邻的内存位置,并提供快速的基于索引的访问。 QList, QLinkedList, QVe…