嵌入式微处理器重点学习(三)

堆栈操作

R1=0x005
R3=0x004
SP=0x80014
STMFD sp!, {r1, r3}
指令STMFD sp!, {r1, r3}是一条ARM架构中的存储多个寄存器到内存的指令,这里用于将r1和r3寄存器的内容存储到栈上。STMFD(Store Multiple Full Descending)是一种全递减模式的多寄存器存储指令,它会先将栈指针(SP)减去将要存储的寄存器数量乘以4(每个寄存器占用4字节),然后将寄存器内容存储到内存中,并最终更新栈指针的值(由于有!后缀,表示更新SP)。
根据给定的值:
R1的值为0x005。
R3的值为0x004。
栈指针SP的初始值为0x80014。
执行STMFD sp!, {r1, r3}指令后的操作结果:
因为要存储R1和R3两个寄存器,所以SP会先减去2 * 4 = 8字节。更新后的SP值为0x80014 - 8 = 0x8000C。
将R1和R3寄存器的内容按顺序(编码小的寄存器先存)存储到栈上,具体为:
R1的内容0x005会被存储到新的SP地址0x8000C。
然后,R3的内容0x004会被存储到0x80010的位置(因为是全递减模式,所以R1存储在更低的地址)。
注意:LDMDB R0!,{R8-R5}指令执行后,R0 - 4执行的地址是传给R8
在ARM汇编语言中,LDMDB R0!, {R8-R5}指令执行的是一个具有递减和写回的多寄存器加载操作。这条指令的含义可以拆解为以下几个部分:
LDM是Load Multiple的缩写,表示这是一个多寄存器加载指令。
DB代表Decrement Before,意味着在加载之前,基址寄存器(本例中为R0)的地址会先递减。
R0!表示使用R0作为基址寄存器,并在操作完成后,更新R0的值。!是写回(write-back)操作的标识。
{R8-R5}意味着从R8到R5这些寄存器将被加载数据。按照ARM的惯例,这样的范围是倒序的,即首先处理R8,然后是R7,以此类推,最后是R5。
关于R0-4执行后的地址是传给R8还是R5,通常在多寄存器加载/存储指令中,寄存器列表是按照升序排列,即使写作{R8-R5},在实际执行过程中也应当理解为操作是从低编号寄存器向高编号寄存器进行。然而,由于LDMDB指令使用的是递减模式,它实际上是从R8开始向下到R5加载数据,每次加载后基地址R0都会递减。
但是,容易引起混淆的一点是,ARM架构文档通常指示,在LDMDB这类指令中,数据是以升序的方式从内存地址加载的,即最低的寄存器号对应最低的地址。所以,如果从R0开始的一段连续内存被加载到了这些寄存器中,那么实际上:
R0的初始值减去递减的总量(因为是DB,所以操作前R0就已经被递减),通过写回操作更新R0的值;
由于是DB模式,所以加载操作是先将R0的值减少相应的数量后(在此例中,涉及到的寄存器数为4,所以可能是R0减少16(如果是32位系统)或更多(取决于寄存器宽度和具体的架构)),然后加载;
由于寄存器列表倒序的标记方式可能会导致理解上的混淆,实际存取顺序与寄存器编号的升序或降序无关,关键是根据指令的递增(IA/IB)或递减(DA/DB)模式确定加载顺序。
参考:https://blog.csdn.net/u011449588/article/details/44945411?spm=1001.2014.3001.5501

类似操作

在ARM指令集中,NE代表“Not Equal”,意味着该指令仅在零标志(Zero Flag)未被设置时执行。
总结操作结果,R1和R3的值会被存储到栈上,栈指针SP会更新为0x8000C,并且内存地址0x8000C和0x80010分别存储了R1和R3的值。
这是一个ARM架构中常见的利用栈保存现场的操作,常在函数调用前执行,以保护当前函数的局部变量和寄存器值不被调用的函数改变,同时调整SP为新的栈顶位置,以用于可能的后续操作。

LDRLE pc, [pc, r0, LSL #2]执行流程

指令LDRLE pc, [pc, r0, LSL #2]是一条条件加载(Load)指令,它的目的是根据某条件将数据从内存加载到程序计数器pc中。这条指令的各个部分代表的含义如下:
LDRLE:这是一个条件加载指令的前缀。LE代表"Less than or Equal",意味着只有当标志寄存器中的条件标志满足小于或等于(Z标志位为1或N不等于V)时,指令才会执行。如果条件不满足,则指令不执行任何操作,相当于NOP(无操作)。
pc:这是目标寄存器,即指令加载数据后的存储位置。这里的pc(程序计数器)用于控制程序的执行流程。
[pc, r0, LSL #2]:这是源操作数,表示加载操作的地址。该地址是通过将寄存器r0的值逻辑左移2位(LSL #2)然后加上当前pc的值来计算得到的。左移2位相当于乘以4,是用于访问数组或跳转表中元素的常用技巧。
执行流程大致如下:
检查条件标志位,判断是否满足"Less than or Equal"的条件。
如果条件满足,计算地址[pc, r0, LSL #2]。
从计算得到的内存地址处加载数据。
将加载得到的数据存储到pc寄存器中,实现程序的跳转。

LE判断

LE在LDRLE pc, [pc, r0, LSL #2]这条指令中代表的是“Less than or Equal to Zero”的意思,不是直接比较两个特定寄存器的值。
在ARM指令中,条件码如LE用于基于程序状态寄存器(condition flags)中的标志来决定是否执行某条指令。具体来说,LE条件码会检查零标志(Zero flag,Z)和符号标志(Negative flag,N)与溢出标志(Overflow flag,V)的关系。当Z标志被设置(表示前一运算的结果为零)或者N和V标志不等(表示负数结果不如预期那样大)时,LE条件满足,此时与LE相关的指令才会执行。因此,LE条件的比较是基于条件标志而不是直接比较寄存器之间的值。
在LDRLE pc, [pc, r0, LSL #2]指令的上下文中,如果条件满足(即程序认为上一个结果小于等于零),则加载指令被执行,否则该指令会被处理器忽略。这允许程序基于状态寄存器中的条件标志来有选择性地执行代码路径,支持分支、循环和条件执行等程序结构。
需注意,由于加载操作改变了pc的值,这实际上完成了一次条件分支操作,改变了程序的执行流程,可能用于实现如函数调用返回、条件分支等操作。此外,由于ARM的pc是流水线结构,对pc的操作通常涉及到流水线的处理,具体的影响需要根据处理器的具体实现来判断。

中断号有什么用

中断号在计算机系统中用于唯一标识每个中断源,它允许处理器和中断控制器正确识别和处理各种中断信号。每个中断源如外设(键盘、鼠标、网络接口)或内部事件(如定时器溢出、软件中断指令等)都分配有唯一的中断号。中断号的具体用途包括:
确定中断源:中断号可以帮助处理器确定触发中断的具体设备或条件。当多个中断源同时请求中断服务时,处理器或中断控制器通过中断号能够区分这些中断源。
中断向量表寻址:处理器使用中断号来访问中断向量表(IVT)或中断描述符表(IDT),这些表包含了每个中断号对应的中断服务程序(ISR)的入口地址。处理器根据中断号索引向量表,获得相应的中断处理程序地址,并跳转执行该程序。
确定中断优先级:在一些系统中,中断号还决定了中断请求的优先级,如recall slice 1所提及的LoongArch指令系统实现了向量中断,采用固定优先级仲裁机制,硬件中断号越大优先级越高。
实现向量化中断:向量化中断(recall slice 2和recall slice 3)通过为每个中断分配不同的号码和处理程序,简化了中断处理过程,省去了识别具体中断源的开销,从而可以加速中断的处理。
因此,中断号对于处理器正确、高效地响应和处理中断至关重要,使得系统能够实现快速的任务切换,及时响应外设请求,保障了运行时的实时性和稳定性。

如何通过__swi(中断号) function给中断函数指定中断号(一般在C代码中撰写)

在ARM架构下,__swi关键字用于在C代码中声明软件中断(Software Interrupt)函数,并为其指定一个特定的中断号。使用这种方法可以实现C代码与特定的中断服务例程(ISR)之间的接口,通常用于嵌入式系统或者操作系统内核的开发中。下面是一个使用__swi关键字来声明软件中断函数的例子:
c

__swi(0x123) void MyInterruptFunction(int argument);

在这个例子中,__swi关键字后跟着括号内的0x123是指定给该软件中断函数的中断号。接下来,void MyInterruptFunction(int argument);声明了一个名为MyInterruptFunction的软件中断函数,它接受一个int类型的参数。
当需要触发这个软件中断时,可以通过以下方式调用这个函数:
c

MyInterruptFunction(argument_value);

此调用将导致产生一个0x123号软件中断,并将argument_value作为参数传递给对应的处理函数。在底层实现中,编译器会将软件中断的调用转换为相应的软件中断指令(如ARM指令集中的SWI指令),并附带正确的中断号。
需要注意的是,具体的__swi关键字的语法和使用方式可能会根据不同的编译器稍有差异。此外,中断服务例程的实现和注册方式也依赖于具体的系统架构和操作系统的要求。

CMN

CMN指令应用示例

假设我们有以下两个寄存器的值:
R1寄存器的值为5
R2寄存器的值为3
我们执行如下指令:

CMN R1, R2

这条指令会将R1和R2的值相加,但不会将结果存储在任何寄存器中。CMN R1, R2等效于R1+R2的操作,但只是用来更新状态寄存器中的标志位,不存储结果。

结果说明

执行上述CMN指令后,R1和R2相加的结果是5 + 3 = 8。根据这个结果,程序状态寄存器(CPSR)将会这样更新:
零标志(Z flag)不会被设置,因为结果8不为零。
负标志(N flag)不会被设置,因为结果8是一个正数。
溢出标志(V flag)和进位标志(C flag)的设置取决于操作数的范围和具体的计算结果。在这个例子中,由于加法未产生位溢出或超过寄存器容量的情况,这两个标志通常不会被设置。
综上所述,CMN指令通过相加操作测试两个数相加的结果,主要用于影响接下来的条件指令,例如BNE(Branch if Not Equal)、BGT(Branch if Greater Than)等,根据CMN操作后状态寄存器中的标志位来决定程序的下一步执行路径。

报错分析

C 编译阶段的错误,语法错误
A 汇编时的错误,汇编语法有问题
L 库不全,地址分配、资源不够的问题
报错

处理器模式

功耗

功率: Dynamic>Standby>Sleep(idle)>off

优先级

在这里插入图片描述
在这里插入图片描述

改变操作

在这里插入图片描述
休眠模式WFI,WFE

Startup.s文件的功能和作用?

设置中断向量与中断服务程序地址
分配堆栈空间
设置时钟,看门狗Timer,内存控制,IO端口
设置中断入口IRQ_Entry
实现Reset_Handler

超过四个参数的处理情况

在ARM架构中,当发生软件中断(SWI)时,通常前四个参数会通过寄存器R0到R3传递给中断服务例程(ISR),如果有更多参数,则会通过堆栈传递。以下是处理超过4个参数的一个简单示例:
首先,假设我们有一个函数ExampleFunction,它需要6个参数,我们希望通过SWI来调用这个函数:
c
Copy

void ExampleFunction(int param1, int param2, int param3, int param4

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MATLAB】语法

MATLAB 基本语法(%{和%}) 赋值 函数名值&#xff1b;for for i1:10循环语句 end//while x0; sum0; while x<100sumsumx;x; end//if if x > 1f x^2 1; elsef 2 * x endswitch onum input(请输入一个数); switch num case -1 //注意case后面没有冒号disp(I am…

大数据与人工智能在保险行业数字化转型中的应用

随着科技的快速发展&#xff0c;大数据和人工智能&#xff08;AI&#xff09;技术在保险行业中扮演着越来越重要的角色&#xff0c;推动了保险行业的数字化转型。通过收集和分析海量的用户数据&#xff0c;利用先进的人工智能算法&#xff0c;保险公司能够更准确地评估风险&…

7z压缩文件解压缩遇到文件末端错误

错误如上。我是之前使用7zip压缩软件压缩本地视频为7z格式&#xff0c;然后将压缩包上传到阿里云盘。今天通过阿里云盘下载这个文件&#xff0c;结果使用7zip解压压缩软件 解压缩这个文件遇到“文件末端错误”&#xff0c;然后在网上找了一圈也没有找到解决办法。 我用winrar解…

window11 系统更新失败处理办法

方法一&#xff1a;运行 Windows 更新疑难解答 按 Win I 打开设置。选择“系统”。选择“疑难解答”&#xff0c;然后点击“其他疑难解答”。找到“Windows 更新”&#xff0c;并运行疑难解答。 方法二&#xff1a;使用 DISM 工具修复系统文件 在开始菜单中搜索“命令提示符…

Perplexity AI — 探索网络,发掘知识,沟通思想

体验地址&#xff1a;Perplexity AI &#xff08;国外网站访问需要梯子&#xff09; Perplexity AI是一款功能强大的人工智能搜索引擎&#xff0c;其特点和优势主要体现在以下几个方面&#xff1a; 功能&#xff1a; 自然语言搜索&#xff1a;Perplexity AI可以理解用户的自然…

【AI实践】Dify调用本地和在线模型服务

背景 Ollama可以本地部署模型&#xff0c;如何集成私有数据、如何外部应用程序对接&#xff0c;因此需要有一个应用开发框架 Dify功能介绍 欢迎使用 Dify | 中文 | Dify 下文将把dify部署在PC上&#xff0c;windows环境&#xff1b; 安装部署 安装dify及docker jacobJacobs…

Jira,一个强大灵活的项目和任务管理工具 Python 库

目录 01初识 Jira 为什么选择 Jira? 02安装与配置 安装 jira 库 配置 Jira 访问 获取 API token: 配置 Python 环境: 03基本操作 创建项目 创建任务 查询任务 更新任务 删除任务 04高级操作 处理子任务 搜索任务 添加附件 评论任务 05实战案例 自动化创建…

消息队列-概述-JMS和AMQP

JMS和AMQP JMS是什么 JMS&#xff08;JAVA Message Service,java 消息服务&#xff09;是 Java 的消息服务&#xff0c;JMS 的客户端之间可以通过 JMS 服务进行异步的消息传输。JMS&#xff08;JAVA Message Service&#xff0c;Java 消息服务&#xff09;API 是一个消息服务…

消息队列-概述-什么是消息队列

什么是消息队列 我们可以把消息队列看作是一个存放消息的容器&#xff0c;当我们需要使用消息的时候&#xff0c;直接从容器中取出消息供自己使用即可。由于队列 Queue 是一种先进先出的数据结构&#xff0c;所以消费消息时也是按照顺序来消费的。 参与消息传递的双方称为 生产…

emoji_call_read

这道题我觉得可以记录一下。 主要函数&#xff0c;一样&#xff0c;先考虑怎么泄露libc基址。 但&#xff0c;0x20实在太小&#xff0c;组成不了连续3个ret syscall。 而且文件中也没pop rdi;ret这个gadget&#xff0c;只能另寻他法。 我们注意到&#xff1a; main函数中的这…

证照之星 XE版软件怎么下载安装? 【详细安装图文教程】

软件简介&#xff1a; 证照之星是国内顶级的证件照片制作软件&#xff0c;具有一键裁剪&#xff0c; 智能背景替换&#xff0c;批量制作、内置证照规格的四大优势。同时两大独创技术&#xff1a;智能去除皮肤油光、证照服装替换。同时支持联机拍摄&#xff1a;支持网络摄像头及…

Python时间序列分析库

Sktime Welcome to sktime — sktime documentation 用于ML/AI和时间序列的统一API,用于模型构建、拟合、应用和验证支持各种学习任务,包括预测、时间序列分类、回归、聚类。复合模型构建,包括具有转换、集成、调整和精简功能的管道scikit学习式界面约定的交互式用户体验Pro…

【字符串】65. 有效数字

本文涉及知识点 字符串 LeetCode65. 有效数字 给定一个字符串 s &#xff0c;返回 s 是否是一个 有效数字。 例如&#xff0c;下面的都是有效数字&#xff1a;“2”, “0089”, “-0.1”, “3.14”, “4.”, “-.9”, “2e10”, “-90E3”, “3e7”, “6e-1”, “53.5e93”,…

LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

文章汇总 总体来看像是一种带权重的残差&#xff0c;但解决的如何高效问题的事情。 相比模型的全微调&#xff0c;作者提出固定预训练模型参数不变&#xff0c;在原本权重矩阵旁路添加低秩矩阵的乘积作为可训练参数&#xff0c;用以模拟参数的变化量。 模型架构 h W 0 x △…

【Linux】 进程信号的发生

送给大家一句话&#xff1a; 何必向不值得的人证明什么&#xff0c;生活得更好&#xff0c;乃是为你自己。 -- 亦舒 进程信号的发生 1 何为信号2 信号概念的基础储备3 信号产生kill系统调用alarm系统调用异常core term Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢…

8086汇编 add指令学习

ADD&#xff0c;是Intel x86平台的汇编加法指令&#xff0c;MEM代指操作数为内存或寄存器&#xff0c;REG代指操作数为寄存器&#xff0c;IMM代指立即数&#xff0c;SEG代指操作数为段寄存器。 形式和示例如下&#xff1b; ADD MEM8,REG8 ADD DS:[BXSI],AL ADD MEM16,R…

20240615在WIN11下的串口调试助手的下载安装以及使用

20240615在WIN11下的串口调试助手的下载安装以及使用 2024/6/15 18:06 百度&#xff1a;串口调试助手 blob:https://apps.microsoft.com/df934d29-fd7a-4873-bb6b-a4ab5a7934c9 串口调试助手 Installer.exe 收发的LOG&#xff1a; rootok3588:/# ./uart_test /dev/ttyS0 11520…

MySQL数据操作与查询- 连接查询

一、引入 1、为什么需要使用连接查询&#xff1f; 查询信息的来源如果来自多张表&#xff0c;则必须对这些表进行连接查询。 2、连接查询的分类 内连接和外连接。 二、内连接 1、概述 将两张表的记录组合在一起&#xff0c;产生一个新的结果。 &#xff08;1&#xff09…

docker desktop for mac os如何使用本地代理

在macbook上弄了个代理&#xff0c;然后按照网上所说的去配代理 然后测试下 docker pull busybox 结果无反应&#xff0c;超时。我去&#xff01;&#xff01;&#xff01; 鼓捣了半天&#xff0c;看了docker官网&#xff0c;问了chatgpt &#xff0c;按照它们所说的试了下也没…

PCL 基于八叉树的去噪滤波

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示1、滤波前2、滤波后本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、原理概述 使用八叉树对点云进行噪点删除的滤波方法实现。 …