arm 的pc和lr寄存器

ARM汇编——PC和LR寄存器理解 寄存器,Arm汇编,PC,LR 阅读详情

 ARM处理器使用流水线来增加处理器指令流的速度,这样可使几个操作同时进行,并使处理与存储器系统之间的操作更加流畅,连续,能提供0.9MIPS/MHZ的指令执行速度。

    PC代表程序计数器,流水线使用三个阶段,因此指令分为三个阶段执行:1.取指(从存储器装载一条指令);2.译码(识别将要被执行的指令);3.执行(处理指令并将结果写回寄存器)。而R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令。一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第一条指令,因此PC总是指向第三条指令。当ARM状态时,每条指令为4字节长,所以PC始终指向该指令地址加8字节的地址,即:PC值=当前程序执行位置+8;

    ARM指令是三级流水线,取指,译指,执行时同时执行的,现在PC指向的是正在取指的地址,那么cpu正在译指的指令地址是PC-4(假设在ARM状态下,一个指令占4个字节),cpu正在执行的指令地址是PC-8,也就是说PC所指向的地址和现在所执行的指令地址相差8。
    当突然发生中断的时候,保存的是PC的地址
    这样你就知道了,如果返回的时候返回PC,那么中间就有一个指令没有执行,所以用SUB pc lr-irq #4。

 

    但是在ADS中PC确实是指向即将执行的指令处,这个是软件处理后的结果,主要是为了用户调试程序方便.

   需要注意的是,当前使用指令STM/STR保存R15时候,保存的可能是当前指令地址值+8字节,也可能保存的是当前的指令地址+12字节.到底是哪种,取决于芯片的具体的设计方式。无论如何,在同一芯片中,要么采用当前的指令地址+8,要么采用当前的指令地址+12。因此对于用户来讲,尽量避免使用STM/STR指令来保存R15的值。但是可以在开始的时候用一段程序对芯片的offset进行测试!

 代码如下:
SUB R1, PC, #4  ;获得下面的存放下面存放STR指令的地址
STR PC,[R0]
LDR R0,[RO]
SUB R0, R0, R1

ARM7中断与PC、LR的问题:

1,假设当前是PC,PC-4,PC-8(三级流水)
2,发生IRQ异常,执行保护操作,LR中保存由于FIQ或IRQ占先而没有被执行的指令的地址(即有些资料上把这个地址写成PC或者当前地址,很费解甚至误解)的下一条地址
3,清空流水线
4,进入中断服务程序
5,待流水线填满,执行操作才被重新挂起(解释了ARM7为什么是0.9MIPS)
6,中断返回前,对LR处理,LR=LR-4,指向之前被清空的已译码但没被执行的指令的地址
7,清空流水线,返回
8,重新对丢弃的前一次已译码指令取指
9,待流水线满,开始继续执行

ARM中pc、lr寄存器  PC(程序计数器)  = windows 中 EIP 解析: 处理器要执行的程序(指令序列)都是以二进制代码序列方式预存储在计算机的存储器中,处理器将这些代码逐条 地取到处理器中再译码、执行,以完成整个程序的执行。为了保证程序能够连续地执行下去,CPU必须具 有某些手段来确定下一条取指指令的地址.程序计数器(PC)正是起到这种作用,所以通常又称之为‘指令计数器’ 。CPU总是按 阅读详情

相关推荐

ARM Cortex-A7中LR与PC寄存器深度解析

程序计数器(PC)和链接寄存器(LR)是ARM架构实现函数调用、异常处理与控制流跳转的底层基石。PC始终指向即将取指的指令地址,其自增行为由指令集长度(ARM/Thumb)决定;LR则在BL/BLX或异常发生时自动保存返回地址,并因处理器模式不同而拥有独立物理实例。二者协同支撑嵌入式系统中的栈帧管理、嵌套中断响应与状态切换,技术价值体现在高可靠性上下文保护与低延迟异常恢复能力。典型应用场景涵盖裸机启动、Linux内核异常向量表、TrustZone安全切换及STM32MP157平台调试。本文聚焦ARMv7-A

weixin_42263617的博客 488

arm架构下读取寄存器信息

voidgetReg() { //根据armcc文档,寄存器不能直接访问,间接访问如下: registerintr_r0__asm("r0"); registerintr_r1__asm("r1"); registerintr_r2__asm("r2"); registerintr_r3__asm("r3"); registerintr_...

goodBoy 4234

ARM中链接寄存器LR与指令寄存器IR的关系及编程实例

在ARM体系结构中,链接寄存器(Link Register,LR)和指令寄存器(Instruction Register,IR)是两个重要的寄存器。在子函数返回时,通过将LR中的值加载到程序计数器(Program Counter,PC)中,程序会返回到正确的位置继续执行。当一个函数调用另一个函数时,当前函数的返回地址会被保存到LR中,以便在子函数执行完成后返回到正确的位置。LR寄存器通常用于存储跳转指令(如BL指令)的返回地址。函数中,首先将LR寄存器的值保存到栈中,然后将字符串地址存储到寄存器R1中。

2301_79326930的博客 1132

ARM汇编学习之寄存器

ARM寄存器学习汇编那么一定要对寄存器非常了解,因为汇编程序是直接针对寄存器操作的。人们也习惯的称我们为“会说话的寄存器”。注:1.    当指令对R15的读取没有超过任何对R15使用的限制时,对R15读取的值是指令的地址加上8字节。2.    用命令读取PC的方式主要用于对附近的数据进行快速,与位置无关的寻址,包括程序中与位置无关的移动。3.    但是在使用STR或STM指令保存时,会出现两种情况:A.     这些指令可将指令地址加8字节保存(和其它指令读取R15一样)B.     这些指令或将指令自

winkyxiao1981的专栏 1803

ARM汇编-2 函数

栈:引出SP、FP寄存器。SP:保存栈顶地址,FP:保存栈底的地址。(栈顶的地址比栈底的地址小,所以获取栈顶的值都是通过sub sp, sp #0x10,是减去一个空间,在存值的时候一般都是[sp+#0x08])stp/str 存值(16个字节/8个字节)ldp/ldr 取值(16个字节/8个字节)stur/ldur 本质上与str/ldr没有区别,带【u】的操作的是一个负值。bl指令:通过lr(x30)寄存器,保存回家的路,bl跳转到对应的方法。

一座明亮的小塔 1981

AI驱动的iOS逆向工程自动化:14阶段工作流与Ghidra集成实践

逆向工程是软件安全分析的核心技术,通过反汇编、调试等手段解析程序内部逻辑与数据流。其原理在于将编译后的二进制代码还原为可理解的逻辑结构,从而发现潜在漏洞或理解软件行为。在移动安全领域,iOS逆向工程具有重要技术价值,能够用于安全审计、漏洞挖掘与恶意软件分析。传统iOS逆向依赖ipsw、class-dump、Frida等工具链组合,存在学习曲线陡峭与流程碎片化问题。本文介绍的ios-reverse-skills项目创新性地将14阶段逆向工程方法论封装为AI可调用的标准化脚本集,通过Ghidra脚本实现Swif

weixin_27268733的博客 434

ARM 内核SP,LR,PC寄存器的理解

ARM 内核SP,LR,PC寄存器 深入理解ARM的这三个寄存器,对编程以及操作系统的移植都有很大的裨益。 1、堆栈指针r13(SP):每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种异常模式、非异常模式(用户模式和系统模式),都有各自独立的堆栈,用不同的堆栈指针来索引。这样当ARM进入异常模式的时候,程序就可以把一般通用寄存器压入堆栈,返回时...

肥嘟嘟的左卫门 4705

从AT指令到万物互联:移远EG800K-CN模块的协议栈深度解析与实践指南

本文深度解析移远EG800K-CN 4G模块的协议栈架构与AT指令体系,涵盖MQTT云端集成、多协议配置优化及工业级故障排除指南。通过实战示例展示如何利用该模块构建稳定可靠的物联网连接方案,实现从设备到云端的万物互联。

jupyter5notebook的博客 363

ARM 内核SP,LR,PC寄存器

深入理解ARM的这三个寄存器,对编程以及操作系统的移植都有很大的裨益。 1、堆栈指针r13(SP):每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种异常模式、非异常模式(用户模式和系统模式),都有各自独立的堆栈,用不同的堆栈指针来索引。这样当ARM进入异常模式的时候,程序就可以把一般通用寄存器压入堆栈,返回时再出栈,保证了各种模式下程序的状态的完整性。

韩左左的专栏 2万+

Ceres-solver examples之pose_graph_3d学习笔记

Ceres-solver examples之pose_graph_3d学习笔记简要说明变量说明关键步骤一、Costfunction的搭建其中包括:二、构造Problem 简要说明 ceres-solver库是google的非线性优化库,可以对slam问题,机器人位姿进行优化,使其建图的效果得到改善。pose_graph_3d是官方给出的二维平面上机器人位姿优化问题,需要读取一个g2o文件,运行程序...

幽冥小龙的博客 3890

FUXA实战:5步搞定基于Web的SCADA系统搭建(含Node.js版本避坑指南)

本文提供了一份基于开源工具FUXA搭建Web版SCADA系统的实战指南。文章重点解析了从环境准备到生产部署的五个核心步骤,并特别强调了Node.js版本选择对西门子S7 PLC通信兼容性的关键影响,帮助开发者避开常见陷阱,快速构建工业监控界面。

weixin_29172963的博客 140

ARM中的SP LR PC寄存器——仿真实操

SP:堆栈指针寄存器-R13 用于异常模式时保护现场和恢复现场 LR:链接寄存器-R14 用于保存子程序返回地址 PC:程序计数器-R15 指向当前正在“取指”的指令。

qq_43229050的博客 1573

基于LSTM算法实现交通流量预测(Pytorch版)

本研究采用PyTorch框架,设计并实现了一种基于LSTM(Long Short-Term Memory)网络的交通流量预测模型。针对时序性显著的交通流量数据,模型首先将多节点、多通道的时空信息整合为一维特征输入至多层LSTM单元,利用其捕捉长期依赖及短期波动的能力进行深度学习。全连接层随后调整时间步长以适应预测周期需求。模型结构灵活,能适应不同节点数、输入输出长度及通道配置,实现在给定历史流量数据基础上对未来交通流量的精准预测,为交通管理与规划提供数据驱动支持。

打酱油的葫芦娃 4641

ARM 内核SP,LR,PC寄存器(转)

ARM 内核SP,LR,PC寄存器 深入理解ARM的这三个寄存器,对编程以及操作系统的移植都有很大的裨益。 1、堆栈指针r13(SP):每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种异常模式、非异常模式(用户模式和系统模式),都有各自独立的堆栈,用不同的堆栈指针来索引。这样当ARM进入异常模式的时候,程序就可以把一般通用寄存器压入堆栈,返回时再出栈,保证了各种模式下程序的状态的完整性。 2、连接寄存器r14(LR):每种模式下r14都有自身版...

face_to的专栏 1417

路径跟踪 | 图解纯追踪算法Pure Pursuit(附ROS C++/Python/Matlab仿真)

纯追踪算法(Pure Pursuit)参考了人类驾驶行为,其基本思想是在待跟踪路径上设置预瞄点(goal-ahead),通过简单的几何方法驱动机器人跟踪预瞄点直至抵达目标位置.本文详细推导纯追踪算法的理论原理及其变种——自适应纯追踪算法(APP)和规范化纯追踪算法(RPP),并提供ROS C++/Python/Matlab三种仿真实现加深理解

FRIGIDWINTER的博客 8411

DRM遇到的实际问题及领悟(3)

DRM遇到的实际问题及领悟(3)

phmatthaus的专栏 637

ARM 中断发生时 PC,LR,SPSR,CPSR寄存器相关问题总结

问:ARM在从SVC模式,进入IRQ中断时,现场是如何保存的? 答:在保存现场时,处于svc模式下时,cpsr寄存器是写入irq模式下的spsr_irq寄存器,而不是svc模式下的spsr_svc,这样,在中断模式下恢复的话,将spsr_irq寄存器里的内容写入cpsr,就能恢复到svc模式了,因为,spsr_irq寄存器里的内容就是svc模式下的状态。 另外 ,PC指针地址,在中断发生时会向LR寄存器赋值,但是赋值对象也不是LR_svc寄存器,而是在IRQ模式下的LR_irq寄存器。 因此,在进入中断IR

weixin_43625081的博客 5515

windows下宝塔安装教程

windows下宝塔安装教程 目录宝塔是什么?宝塔安装流程1.下载2.配置3.登录4.安装的环境套件小结 宝塔是什么? 宝塔是管理服务器的免费的软件,宝塔上面可以进行对你的服务器批量进行管理,对于运维人员来说还是必不可少的一个软件,值得使用。 宝塔安装流程 1.下载 链接: https://download.bt.cn/win/panel/BtSoft.zip 下载后安装买最好自定义目录,方便找 2.配置 下载完成后会出现这个页面,对着页面进行配置 点击默认密码复制进来,这里注意一点就是一定要查看

你在看屏幕的同时,屏幕也在注视着你 4423

ARM指针寄存器——堆栈指针寄存器SP、程序计数器PC、连接寄存器LR(1)

你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!” />你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!更多资料点击此处获qu!!

disrm84160的博客 2196

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ARM指针寄存器——堆栈指针寄存器SP、程序计数器PC、连接寄存器LR

在随机存储器区划出一块区域作为堆栈区,数据可以一个个顺序地存入(压入)到这个区域之中,这个过程称为‘压栈’(push )。通常用一个指针(堆栈指针 SP—StackPointer)实现做一次调整,SP总指向最后一个压入堆栈的数据所在的数据单元(栈顶)。从堆栈中读取数据时,按照堆栈 指针指向的堆栈单元读取堆栈数据,这个过程叫做 ‘弹出’(pop ),每弹出一个数据,SP 即向相反方向做一次调整,如此就实现了后进先出的原则。 堆栈是计算机中广泛应用的技术,基于堆栈具有的数据进出LIFO特性,常应用于保存中断断

zhuguanlin121的博客 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【嵌入式】---- ARM寄存器_SP,LR,PC,特殊寄存器

寄存器组 CM3拥有通用寄存器组R0~R15和一些特殊寄存器 R13:SP堆栈指针寄存器 功能:指向堆栈的栈顶 详解: 1)异常模式发生时,程序把通用寄存器压入堆,SP一直指向栈顶的位置。返回时再出栈,保证程序状态的完整性。 2)有MSP 和PSP(两者只需一个,不能同时使用,默认MSP)。 MSP :主堆栈指针,系统用。PSP : 进程堆栈指针,个人堆栈指针。 R14:LR连接寄存器 功能:保...

wyifan_的博客 4563

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

0039__ARM 中SP,LR,PC寄存器的作用

ARM 中SP,LR,PC寄存器的作用 - 咸鱼书生 - 博客园

行潇 257

ARM嵌入式软件开发 - 寄存器组 (SP, LR, PC)[0x04]

ARM寄存器组是ARM架构中至关重要的组成部分,理解这些寄存器有助于深入掌握嵌入式系统的开发。ARM处理器包含16个主要寄存器(R0-R15),每个寄存器有不同的用途,如通用数据存储、堆栈指针、程序计数器等。掌握这些寄存器的功能,不仅能提升代码的优化能力,还能增强对ARM指令集和体系结构的理解,为后续开发奠定坚实基础。

qq_46817570的博客 2046

ARM的PC和LR寄存器

1、ARM一般采用三条流水线处理代码: (1)取值,(2)译码,(3)执行 以当前正在执行的指令为第一名的话, PC=当前指令地址+(单位步进*2),其中单位步进,在thumb指令下为2,在arm指令下为4 2、LR始终指向跳转指令的一条指令 转载于:https://www.cnblogs.com/ywledoc/p/4173701.html...

weixin_30908707的博客 275
上一篇: 哈佛结构与冯诺伊曼结构
下一篇: arm 中的nor flash 和 nand flash
creat_ok
博客等级 码龄15年 1粉丝 2原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值