ARM知识点二

news2024/11/22 15:39:33

一、指令

  1. 指令的生成过程
    在这里插入图片描述
  2. 指令执行过程示例
if (a == 0) {
    x = 0;
} else {
    x = x + 3;
}
//翻译为
cmp r0,#0
MOVEQ R1,#0
ADDGT R1,R1,#3

指令获取:从Flash中读取 CMP R0, #0,控制器开始执行。
指令解码:解码器解析 CMP 指令,ALU比较R0的值和0。

条件执行:
若条件满足 EQ,执行 MOVEQ,将0放入R1。
若条件满足 GT,执行 ADDGT,将R1加3。

结果存储:将计算结果保存在R1中。
在这里插入图片描述

二、ARM的工作模式

  1. 用户模式(USR模式)
    权限:最低
    资源:最少
    用途:用于执行普通任务,例如应用程序。大部分程序都运行在用户模式下。
  2. 管理员模式(SVC模式)
    权限:高
    资源:多
    用途:用于执行核心级任务,例如操作系统的核心代码。
  3. 中断模式(IRQ模式)
    权限:高
    资源:多
    用途:用于执行中断代码,处理普通中断请求。
  4. 快速中断模式(FIQ模式)
    权限:更高
    资源:最多
    用途:用于快速处理高优先级中断请求。虽然在某些操作系统(如 Linux)中不常用,但它提供了更快的响应时间。
  5. 数据终止模式(abort模式)
    用途:用于处理内存访问错误。当程序尝试访问非法或无效内存地址时,处理器进入该模式以处理异常。
对寄存器的分配情况
  • R0-R7 为所有模式所共享;
  • R8-R12 有两份, FIQ模式独享一份;
  • R13-R14每种模式都有一份;
模式切换过程中,特殊寄存器的作用

在这里插入图片描述

CPSR寄存器

在这里插入图片描述

  • 可以对CPSR的某些位修改而达到想要的效果。不用背,直接查。

三、立即数

  • 一条指令,存放常数的区域只有 12bit; 造成的问题是,当指令中出现大常数的时候, 无法存入12bit中,形成 非法指令!
  • ARM公司 将12bit分为 低8bit–X,高4bit–Y,最终的结果是 : X<<2Y ,这样的 8bit常数经过偶数位#循环左移#得到的数据,称之为 立即数;
  • 0x10E0 是不是立即数----> 否
    0x10D0 ----------------- 否
    0x10C0 ----------------- 是
  • 简便方法是判断基值(立即数的范围是0x00到0xFF。)
    1.补全32位
    2.最边上的两个1中间间隔不能超过6个数(包括0,也包括逻辑左移时)
    3.其次是这少于等于8个数要放在8位中时,只能移动偶数位,才符合立即数标准,左右移动都可以
  • 当要存放较大的数时,通常采用伪指令
Ldr r0 ,=0x12345678 @编译器会用真实的指令替换

四、补充一些伪指令

.byte
解释:.byte指令告诉编译器将后面的数据按照字节(1字节)进行存储。

.byte 0x41, 0x42, 0x43  ; 存储ASCII字符'A', 'B', 'C'
char buf[] = {0x41, 0x42, 0x43};  // 初始化字符数组

.word
解释:.word指令用于告诉编译器将后面的数据按照4字节(32位)为单位进行存储。常用于初始化整型数组或表示32位整数。

.word 0x12345678, 0x9ABCDEF0  ; 存储两个32位整数,.word开始的地址就是存放这0x12345678
int xi[] = {0x12345678, 0x9ABCDEF0};  // 初始化整型数组

.equ

解释:.equ伪指令用于定义符号常量。它将某个符号与一个特定的值绑定,这样在代码中可以使用符号来代替具体的数值。

.equ PI, 3.14  ; 将符号PI定义为3.14

五、异常

  • 异常(Exception)是指处理器对一些特定事件(例如中断、错误、系统调用等)所做出的响应。异常处理是嵌入式系统中非常重要的一部分,因为它允许系统在发生特定事件时进行处理,从而确保系统的可靠性和稳定性。
1. 异常向量表
异常类型向量地址描述异常模式
Reset0x00复位异常Supervisor
Undefined Instruction0x04未定义指令异常Undefined
SWI0x08软件中断Supervisor
Prefetch Abort0x0C预取指令中止异常Abort
Data Abort0x10数据中止异常Abort
IRQ0x18普通中断请求异常IRQ
FIQ0x1C快速中断请求异常FIQ
2. 同时发生时,处理优先级
  1. 复位(Reset)
    处理器上电或者复位时发生的异常
  2. 数据中止(Data Abort)
    数据访问错误时发生的异常,一般是与Memory 误操作有关,如对不合法的内存地址、0地址写操作,或对一些Memory 越界操作。
  3. FIQ(快速中断请求)
    FIQ用于快速响应时间敏感的外部硬件中断,优先级高于IRQ。
  4. IRQ(普通中断请求)
    IRQ用于处理标准的外部硬件中断。优先级低于FIQ。
  5. 预取指令中止(Prefetch Abort)
    在指令预取阶段,如果试图访问的指令地址无效或产生错误,则会触发预取指令中止。
  6. 未定义指令(Undefined Instruction)
    当处理器遇到未定义或不支持的指令时触发。常用于调试和异常捕获。
  7. SWI(软件中断)
    软件中断由SWI指令触发,通常用于执行系统调用或从用户模式切换到内核模式。
3.异常的处理过程

1.流程图(类似于工作模式的切换)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/40fb30e1475b472893e02e54ddf718a4.png

  1. 异常处理是计算机系统中处理突发事件的关键机制,不同的异常处理需要不同的资源和权限。为了有效处理异常,系统在处理过程中通常会切换到更高权限的模式(如内核模式),这种模式切换由硬件自动完成,确保处理器获得所需的资源和权限。
  2. 中断异常是异常处理中最重要的类型之一,它能够显著提高系统的响应速度和执行效率。通过快速响应外部事件(如输入输出操作),中断机制使系统能够在需要时中断当前任务来处理更紧急的任务,从而优化资源利用和提升系统性能。
4.中断和异常之间的关系
  1. 软中断通常也称之为异常,是由处理器内部条件触发的中断。通常由软件指令触发(除数为0),同步发生的。一般用于实现系统调用和任务调度
  2. 异常是由处理器检测到的错误条件或特殊事件自动触发。软中断可以通过指令主动触发。
  3. 硬中断也称为真正的中断,硬中断是由硬件设备(磁盘)发出的中断信号,通知处理器有外部事件需要处理。硬中断是异步的,随时发生。
  4. 正常指令执行 → 检测到异常信号 → 查找异常向量表 → 根据中断向量号获取中断描述符 → 跳转到异常处理程序 → 执行处理例程 → 恢复上下文并返回原程序 → 继续执行
5. 异常向量表的优化
  1. 问题背景:在ARM异常向量表中,通常需要使用固定偏移来指向异常处理程序。当异常处理程序的地址(例如swi_handle)非常大时,无法直接使用简单的分支指令(如B指令)跳转,因为这些指令可能受限于指令编码长度(通常16位或32位),导致无法存储长地址。
  2. 解决方案:
    采用LDR指令间接加载处理程序的地址,从而跳转到真正的处理程序位置。这允许在向量表中使用一个更小的跳转指令和更灵活的地址加载方式。
  3. 实例
b reset         @0x0   ; 跳转到复位处理程序
nop                    ; 无操作,可能用于对齐或延迟
ldr pc, _swi   @0x8   ; 从_swi标签处加载地址到PC,跳转到SWI处理程序
nop                    ; 无操作,占位符
nop
nop
ldr pc, _irq   @0x18  ; 从_irq标签处加载地址到PC,跳转到IRQ处理程序
nop                    ; 无操作,占位符

_swi:				  @@ _swi 一定要紧贴着 异常向量表,保证 他的值很小
    .word swi_handle  @0x12345678 ; 存储SWI处理程序的地址

_irq:
    ; 可能会有类似的定义来加载IRQ处理程序

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

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

相关文章

DAMA学习笔记(十)-数据仓库与商务智能

1.引言 数据仓库&#xff08;Data Warehouse&#xff0c;DW&#xff09;的概念始于20世纪80年代。该技术赋能组织将不同来源的数据整合到公共的数据模型中去&#xff0c;整合后的数据能为业务运营提供洞察&#xff0c;为企业决策支持和创造组织价值开辟新的可能性。与商务智能&…

浅谈线程组插件之jp@gc - Ultimate Thread Group

浅谈线程组插件之jpgc - Ultimate Thread Group jpgc - Ultimate Thread Group是JMeter的一个强大且灵活的扩展插件&#xff0c;由JMeter Plugins Project提供。它为性能测试提供了超越JMeter原生线程组的更精细的控制能力&#xff0c;允许用户根据复杂的场景设计自定义负载模…

【TFT电容屏】

TFT电容屏基础知识补课 前言一、入门知识1.1 引脚介绍1.1.1 显示部分片选指令选择写指令读操作复位并行数据接口 1.1.2 背光电源背光电源 1.1.3 触摸IIC接口外部中断接口复位NC 1.2 驱动介绍1.3 FSMC介绍 总结 前言 跟着阳桃电子的学习⇨逐个细讲触摸屏接口定义–STM32单片机…

科普文:JUC系列之ForkJoinPool源码解读ForkJoinWorkerThread

科普文&#xff1a;JUC系列之ForkJoinPool基本使用及原理解读-CSDN博客 科普文&#xff1a;JUC系列之ForkJoinPool源码解读概叙-CSDN博客 科普文&#xff1a;JUC系列之ForkJoinPool源码解读WorkQueue-CSDN博客 科普文&#xff1a;JUC系列之ForkJoinPool源码解读ForkJoinTask…

复现sql注入漏洞

Less-1 字符型注入 页面如下&#xff1a; 我们先输入“?id1”看看结果&#xff1a; 页面显示错误信息中显示提交到sql中的“1”在通过sql语句构造后形成“1" LIMIT 0, 1”&#xff0c;其中多了一个“”&#xff0c;那么&#xff0c;我们的任务就是——逃脱出单引号的控制…

petalinux安装成功后登录Linux出现密码账号不正确

安装完Linux系统后发现登陆开发板上的Linux系统登陆一直错误&#xff0c;但你输入的账号和密码确确实实是“root”&#xff0c;但仍然一直在重复登陆。 这个时候就会怀疑自己是不是把密码改了&#xff0c;导致错误&#xff0c;然后又重新创建petalinux工程。 其实这个时候不需…

2024年第二季度HDD出货量和容量分析

概述 根据Trendfocus, Inc.发布的《SDAS: HDD Information Service CQ2 24 Quarterly Update – Executive Summary》报告&#xff0c;2024年第二季度硬盘驱动器(HDD)出货量和容量均出现了显著增长。总体来看&#xff0c;HDD出货量较上一季度增长2%&#xff0c;达到3028万块&a…

MySQLDM笔记-查询库中是否存在列出的表名及查询库中列出的不存在的表名

如下表名&#xff1a; aaa,bb,cc,ccs,dds,csdf,csdfs,sdfa,werwe,csdfsd 在MySQL库中&#xff0c;查询哪些表名在数据库中 SELECT table_name FROM information_schema.tables WHERE table_schema your_database_name_here AND table_name IN (aaa, bb, cc, ccs, dds, csdf…

硬件电路学习记录(七)——全面概述MOS管

目录 1.NMOS&#xff1a; 工作原理 特性 应用 2.PMOS&#xff1a; PMOS的结构与工作原理 结构 工作原理 增强型PMOS与耗尽型PMOS 增强型PMOS&#xff08;Enhancement Mode PMOS&#xff09; 耗尽型PMOS&#xff08;Depletion Mode PMOS&#xff09; 应用 PMOS的工…

不同角色路由权限配置(六)

一、启用方式 配置开启config/config.ts。同时需要 src/access.ts 提供权限配置 export default {access: {},// access 插件依赖 initial State 所以需要同时开启initialState: {}, };这里以扩展的路由配置为例&#xff0c;配置只有admin权限才能查看的页面 1、在src/acces…

新华三H3CNE网络工程师认证—路由基础

我们的一个个网络其实是由不同的广播域构成的&#xff0c;而路由器的作用就是用来连接不同的广播域。那么不同广播域之间是如何通信的呢&#xff1f;比如有三个网段&#xff0c;1.0、2.0和3.0。网段1.0和网段2.0通信需要构造数据包&#xff0c;源是1.1&#xff0c;目标去往2.1。…

3.6 上下文菜单

上下文菜单 上下文菜单就是常见的右键菜单(弹出式菜单)。 显示上下文菜单&#xff0c;阻塞函数 BOOL TrackPopupMenu(HMENU hMenu, //菜单句柄UINT uFlags, //显示方式int x, //水平位置&#xff0c;屏幕坐标系int y, //垂直位置&#xff0c;屏幕坐标系UINT nReserved, //…

Cartopy简介和安装

Cartopy 是一个开源免费的第三方 Python 扩展包&#xff0c;由英国气象办公室的科学家们开发&#xff0c;支持 Python 2.7 和 Python 3&#xff0c;致力于使用最简单直观的方式生成地图&#xff0c;并提供对 matplotlib 友好的协作接口。初学Cartopy&#xff0c;欢迎指正&#…

Leetcode—186. 反转字符串中的单词 II【中等】Plus

2024每日刷题&#xff08;152&#xff09; Leetcode—186. 反转字符串中的单词 II 实现代码 class Solution { public:void reverseW(vector<char>& s, int n) {int i 0;int j 0;while(i < n) {while(i < j || i < n && s[i] ) {i;}while(j &…

Spring自动装配的局限

Spring自动装配的局限 1. 覆盖风险2. 类型限制3. 精确性挑战4. 维护难度 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; Spring的自动装配功能虽然为开发者带来了极大的便利&#xff0c;但在实际应用中也存在一些不容忽视的局限。 1. 覆盖…

大数据-65 Kafka 高级特性 分区 Broker自动再平衡 ISR 副本 宕机恢复再重平衡 实测

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

科普小课堂|LCD 问题排查思路解析

&#xff08;ELF 1开发板、ELF 1S开发板及显示屏&#xff09; 在嵌入式系统开发中&#xff0c;液晶显示器&#xff08;LCD&#xff09;作为人机交互的重要界面&#xff0c;其稳定性和可靠性至关重要。然而在实际应用中&#xff0c;LCD难免会遇到各种问题。今天和各位小伙伴分享…

Javascript常见算法(二)【学习】

动态规划 斐波那契数列&#xff1a; 经典的动态规划问题&#xff0c;每个数是前两个数的和。 斐波那契数列&#xff08;Fibonacci sequence&#xff09;是一个非常著名的数列&#xff0c;其中每个数是前两个数的和&#xff0c;序列以0和1开始。在JavaScript中&#xff0c;有多…

【数据结构】顺序表详解以及实现(C语言实现)

目录 前言&#xff1a; 顺序表的特点&#xff1a; 顺序表简介&#xff1a; 顺序表具体实现&#xff1a; 1.初始化 2.销毁 3.检查空间容量 4.头插和尾插 5.头删和尾删 6.打印 7.指定位置插入 8.指定位置删除 9. 查找是否有对应元素 顺序表是线性表的存储结构&#xff…

8月5日笔记

8月5日 nmap命令使用 nmap四种基本功能&#xff1a;端口扫描、主机探测、服务识别、系统识别。 nmap ip默认情况下&#xff0c;nmap 会对目标执行 TCP 端口扫描&#xff0c;尝试找出哪些端口是开放的&#xff0c;并提供关于这些端口上运行的服务的一些基本信息。 其他参数&…