ARM-V7架构(一)

news/发布时间2024/5/15 20:59:41
cortex-A7基于ARMV7-A架构,复习一下armv7
 

ARM-V7的模式类型如下:

0
FIQ快速中断和IRQ外部中断的区别:当一个高优先级中断产生时将会进入FIQ,一般用于高速数据传输和通道处理。当一个低优先级中断产生将会进入IRQ,一般用于通常的中断处理
0
 
处理器模式可以通过软件控制进行切换,也可以通过外部中断或异常处理过程进行切换。大多数用户程序运行在用户模式下。当处理器工作在用户模式时,应用程序不能访问受操作系统保护的一些系统资源,应用程序也不能直接进行处理器模式切换。当需要进行处理器模式切换时,应用程序可以产生异常处理,在异常处理过程中进行处理器模式切换。这种体系结构可以使操作系统控制整个系统资源的使用。
 

Cortex-A7处理器寄存器组:

0
1、在寄存器组中,每个方块都是一个寄存器,每个寄存器都是32位的
2、寄存器没有地址,访问寄存器通过编号进行访问,r0-r15,cpsr,spsr(spsr是cpsr的影子寄存器)
3、banked类型的寄存器属于该模式下私有的寄存器,而非banked类型的寄存器属于公有寄存器组
4、user模式和system模式最多可以访问17个寄存器,HYP模式最多可以访问19个寄存器,其他模式可访问18个寄存器
5、cortex-A7寄存器组中一共只有43个寄存器,因此开发中尽量不要定义register类型的变量
6、通用寄存器可分为两类:
0
未分组寄存器,包括R0-R7。
分组寄存器,包括R8-R12。
 

栈指针寄存器R13

R13寄存器在ARM处理器中常用为栈指针,称为SP。
每一种异常模式拥有自己的R13。异常处理程序负责初始化自己的R13,使其指向该异常模式专用的栈地址。在异常处理程序入口处,将用到的其他寄存器的值保存在堆栈中,返回时,重新将这些值加载到寄存器。通过这种保护程序现场的方法,异常不会破坏被其中断的程序现场
SP栈指针寄存器存放的是栈指针指向的栈空间的地址。此栈是用来压栈保护现场的,特点是先进后出
满减栈如图所示:
0
代码分析:
给每一个模式都设置对应的栈空间
init_stack:ldr        r0,stacktop         /*get stack top pointer,stacktop是一个地址*//********svc mode stack********/mov        sp,r0sub        r0,#128*4          /*512 byte  for irq mode of stack*//****irq mode stack**/msr        cpsr,#0xd2        /*切换至IRQ模式*/mov        sp,r0sub        r0,#128*4          /*512 byte  for irq mode of stack*//***fiq mode stack***/msr     cpsr,#0xd1mov        sp,r0sub        r0,#0/***abort mode stack***/msr        cpsr,#0xd7mov        sp,r0sub        r0,#0/***undefine mode stack***/msr        cpsr,#0xdbmov        sp,r0sub        r0,#0/*** sys mode and usr mode stack ***/msr        cpsr,#0x10mov        sp,r0             /*1024 byte  for user mode of stack*/
测试栈:
    /****irq mode stack**/msr        cpsr,#0xd2        /*切换至IRQ模式*/mov        sp,r0sub        r0,#128*4          /*512 byte  for irq mode of stack*/    mov             r5, #0x11          /*0x11赋给r5*/mov             r6, #0x23          /*0x23赋给r6*/stmfd           sp!, {r5, r6}      /*r5,r6入栈*/ldmfd           sp!, {r7, r8}      /*出栈值给到r7, r8*/    
监控寄存器的值和栈指针的变化:
寄存器
执行完第四行
执行完第五行
执行完第六行
执行完第七行
执行完第八行
r5
0
0x11
0x11
0x11
0x11
r6
259635441
259635441
0x23
0x23
0x23
r7
1667
1667
1667
1667
0x11
r8
384526877
384526877
384526877
384526877
0x23
sp
0xc200844
0xc200844
0xc200844
0xc20083c
0xc200844
 

连接寄存器R14:

寄存器R14又被称为连接寄存器(Link Register,LR),可以被用作通用寄存器使用。在ARM体系结构中具有下面两种特殊的作用。每一种处理器模式用自己的R14存放当前子程序的返回地址,比如中断异常处理模式。当通过BL或BLX指令调用子程序时,R14被设置为该子程序的返回地址。在子程序返回时,把R14的值复制给程序计数器PC,典型的用法如下:
使用方法一:
mov pc,lr
bx lr
使用方法二:
在子程序入口处使用下面的指令将PC保存到栈中。
stmfd sp!, {,lr}
在子程序返回时,使用以下相应的配套指令返回:
ldmfd sp!, {,pc}
当异常中断发生时,该异常模式特定的物理寄存器R14被设置为该异常模式的返回地址。

 

 

程序计数寄存器R15:

R15又被称为PC程序计数寄存器。PC寄存器中存储的是当前取值的指令的地址,当完成取值操作之后,PC中的值会自动加4指向下一条指令
 

程序状态寄存器CPSR:

所有的处理器模式都共用一个 CPSR 物理寄存器,因此 CPSR 可以在任何模式下被访问。CPSR 是当前程序状态寄存器,该寄存器包含了条件标志位、中断禁止位、当前处理器模式标志
等一些状态位以及一些控制位。所有的处理器模式都共用一个 CPSR 必然会导致冲突,为此,除了 User 和 Sys 这两个模式以外,其他 7 个模式每个都配备了一个专用的物理状态寄存器,叫
做 SPSR(备份程序状态寄存器),当特定的异常中断发生时,SPSR 寄存器用来保存当前程序状态寄存器(CPSR)的值,当异常退出以后可以用 SPSR 中保存的值来恢复 CPSR。
因为 User 和 Sys 这两个模式不是异常模式,所以并没有配备 SPSR,因此不能在 User 和Sys 模式下访问 SPSR,会导致不可预知的结果。由于 SPSR 是 CPSR 的备份,因此 SPSR 和CPSR 的寄存器结构相同,
CPSR寄存器包含下列内容:
  • ALU(逻辑运算单元)状态标志
  • 当前处理器模式
  • 中断使能标志
  • 设置处理器的状态

 

 

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

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

相关文章

NOIP 2024游记,我附中

日记碎了一地……前言 作者真的去了 NOIP2024,但本文纯属虚构。 赛前 Day -1 下午 已是 NOIP2024 前的最后一天,可当我上台讲题时,脑袋里满是眩晕的感觉,大概嘴唇发白,已经站在死亡的边缘了。 子洢 [Note 1],子洢,我好像再也见不到我的姐姐了。多希望她能陪在我身边啊。…

Linux环境下Minio的安装部署与启动教程(完整版)

1、概述 MinIO是一个开源、分布式的对象存储系统,专为云原生环境设计。它提供了一个基于标准的Amazon S3兼容接口,使得开发者可以使用熟悉的API在私有云或边缘环境中部署和管理大规模非结构化数据,如图片、视频、日志文件等。 MinIO的核心特点包括: 高性能:采用Golang编写…

人人都是艺术家!AI工具Doodly让潦草手绘变精美画作

AI绘画界太卷了,一天一个新东西,不久前刚给大家介绍了可以一秒出图的SDXL-Turbo,今天来聊一聊另一位重磅选手Doodly有用过Stable Diffuison的小伙伴都知道,想要生成一张高质量的图片,需要输入非常详细的提示词,并伴随多次“摇色子”才能获得满意的结果,有没有简便的方法…

从零开始的 DP 学习记录

为了补上我dp的短板(其实说真的dp约等于没学过,板都没有的那种),也为了以后复习dp不会再忘记dp怎么写,dp的各种思想是怎么来的,从零开始学习 dp ,并记录在此博客。 当然也会记录日常生活 大概是首发于洛谷博客,可能会同步到博客园,以后搭了个人blog就会同步到个人blog…