什么是ARM中的SP(堆栈)和LR?

发布者:DazzlingSpirit最新更新时间:2020-03-30 来源: eefocus关键字:ARM  堆栈 手机看文章 扫描二维码
随时随地手机看文章

问题描述

我一遍又一遍地阅读定义,我还没有得到什么是ARM中的SP和LR?我明白PC(它显示下一个指令的地址),SP和LR可能是相似的,但我只是不明白它是什么。你可以帮我吗?

编辑:如果你可以用例子说明一下,那会很棒。

编辑:终于弄清楚LR是什么,还没有得到什么SP。


link register。

SP是堆栈指针。堆栈通常用于在函数调用中保存”automatic”变量和上下文/参数。从概念上讲,您可以将”stack”视为您”pile”您的数据的地方。您将”stacking”保留在一个数据之上,堆栈指针告诉您”high”的数据是”stack”。您可以从”stack”的”top”中删除数据并缩短。


从ARM架构参考:

SP, the Stack Pointer

Register R13 is used as a pointer to the active stack.

In Thumb code, most instructions cannot access SP. The only instructions that can access SP are those designed to use SP as a stack pointer. The use of SP for any purpose other than as a stack pointer is deprecated. Note Using SP for any purpose other than as a stack pointer is likely to break the requirements of operating systems, debuggers, and other software systems, causing them to malfunction.

LR, the Link Register

Register R14 is used to store the return address from a subroutine. At other times, LR can be used for other purposes.

When a BL or BLX instruction performs a subroutine call, LR is set to the subroutine return address. To perform a subroutine return, copy LR back to the program counter. This is typically done in one of two ways, after entering the subroutine with a BL or BLX instruction:

• Return with a BX LR instruction.

• On subroutine entry, store LR to the stack with an instruction of the form: PUSH {,LR} and use a matching instruction to return: POP {,PC} …

This link gives an example of a trivial subroutine.

Here is an example of how registers are saved on the stack prior to a call and then popped back to restore their content.


http://github.com/lsasim我创建了一个教学处理器,并有一个汇编语言教程。在那里我会经历关于堆栈的讨论。它不是一个手臂处理器,但故事是一样的,它应该直接转换到你想要在手臂或大多数其他处理器上理解。


例如,您的程序中需要20个变量,但只有16个寄存器减去至少三个(sp,lr,pc),这些是特殊用途。你将不得不将一些变量保留在ram中。让我们说r5拥有一个你经常使用的变量,你不想保持在ram中,但是有一段代码,你真的需要另一个注册表来做某事,r5没有被使用,你可以保存r5堆栈以最小的努力,而您重用r5的其他东西,然后,很容易,恢复它。

传统(不一定都回到起初)手臂语法:


...

stmdb r13!,{r5}

...temporarily use r5 for something else...

ldmia r13!,{r15}

...


stm是存储多个,一次可以保存多个寄存器,直到所有这些都在一个指令中。


db表示之前递减,这是从高地址到较低地址的向下移动堆栈。


您可以使用r13或sp来指示堆栈指针。该特定指令不限于堆栈操作,可用于其他操作。


的!意味着在完成后用新地址更新r13寄存器,这里再次使用stm可以用于non-stack操作,因此您可能不想更改基地址寄存器,离开!在这种情况下。


然后在括号{}中列出要保存的寄存器,以逗号分隔。


ldmia是相反的,ldm表示加载多个。 ia表示递增,其余与stm相同


所以如果你的堆栈指针在0x20008000,当你打到stmdb指令看到,因为列表中有一个32位寄存器,它将在它使用它之前减少r13中的值,所以0x20007FFC然后它在存储器中写入r5到0x20007FFC,并保存值0x137FFC在r13。后来,假设你没有错误,当你得到ldmia指令r13有0x20007FFC在其中有一个单一的注册表在列表r5。所以它在0x20007FFC读取内存将该值放在r5中,ia表示增量后,0x20007FFC将一个寄存器大小增加到0x20008000,而!意味着将该号码写入r13以完成指令。


你为什么要使用堆栈而不是固定的内存位置?那么上面的美妙之处在于,当您运行该代码或0x20002000或其他任何代码仍然可以运行时,r13可以是0x20007654,如果您在循环中使用该代码,或者在循环中使用该代码,或者对于每个级别您递交的递归保存r5的新副本,您可能有30个保存的副本,具体取决于您在该循环中的位置。并且当它展开时,将所有副本放回所需的位置。单个固定内存位置不起作用。这将直接转换为C代码作为示例:


void myfun ( void )

{

   int somedata;

}


在这样的C程序中,变量somedata存在于堆栈中,如果您递归调用myfun,则根据递归的深度,您将有多个副本的somedata值。此外,由于该变量仅在函数内部使用,并且不需要其他位置,那么您可能不想在程序的生命周期内为该变量刻录一定量的系统内存,只需要在该函数中使用这些字节,并释放该内存不在那个功能。这就是堆栈的用途。


在堆栈中找不到全局变量

回去…

说你想实现和调用这个函数,你会在调用myfun函数时有一些代码/函数。 myfun函数希望使用r5和r6,当它正在操作的东西,但它不想垃圾的任何人称它是使用r5和r6这样的持续时间的 myfun()你想要保存在堆栈上的这些寄存器。同样,如果您查看分支链接指令(b1)和链接寄存器lr(r14),则只有一个链接寄存器,如果从函数调用函数,则需要在每次调用时保存链接寄存器,否则您无法返回。


...

bl myfun

    <--- the return from my fun returns here

...

 

 

myfun:

stmdb sp!,{r5,r6,lr}

sub sp,#4 <--- make room for the somedata variable

...

some code here that uses r5 and r6

bl more_fun <-- this modifies lr, if we didnt save lr we wouldnt be able to return from myfun

   <---- more_fun() returns here

...

add sp,#4 <-- take back the stack memory we allocated for the somedata variable

ldmia sp!,{r5,r6,lr}

mov pc,lr <---- return to whomever called myfun.


所以希望你可以看到堆栈的使用和链接寄存器。其他处理器以不同的方式做同样的事情。例如有些将把返回值放在堆栈上,当你执行返回函数时,它通过从栈中拉一个值来知道在哪里返回。编译器C /C++等通常会有一个”calling convention”或应用程序接口(ABI和EABI是ARM定义的名称)。如果每个函数遵循调用约定,则将参数传递给在正确的寄存器或堆栈中被调用的函数。并且每个函数遵循规则,关于什么寄存器不必保留其内容和什么寄存器来保存内容,那么你可以使用函数调用函数调用函数,并执行递归和各种事情,只要堆栈不会太深,以至于它运行到用于全局变量和堆的内存中,所以您可以调用函数并从整个日期返回。 myfun的上述实现与编译器生成的内容非常相似。


ARM现在有很多核心和一些指令集,cortex-m系列的工作原理有所不同,只要没有一堆模式和不同的堆栈指针。并且在拇指模式下执行拇指指令时,您可以使用推送和弹出指令,这些指令不会让您自由使用任何类似stm的寄存器,它只使用r13(sp),而且您无法仅将所有寄存器保存在其特定子集中。流行的手臂组装人员允许您使用


push {r5,r6}

...

pop {r5,r6}


手臂代码以及拇指代码。对于arm代码,它编码适当的stmdb和ldmia。 (在缩略图模式下,您也不必选择使用db的时间和位置,之前递减,ia,后增加)。


不,您绝对不必使用相同的寄存器,您不必配对相同数量的寄存器。


push {r5,r6,r7}

...

pop {r2,r3}

...

pop {r1}


假设在这些指令之间没有其他堆栈指针修改,如果你记得sp将被递减12个字节的推送,我们说从0x1000到0x0FF4,r5将被写入0xFF4,r6到0xFF8和r7到0xFFC堆栈指针将变为0x0FF4。第一个pop将取值为0x0FF4,并将其放在r2中,然后将值置于0x0FF8,并将其置于r3中,堆栈指针将获取值0x0FFC。稍后最后一个pop,sp为0x0FFC,读取的值为r1,然后堆栈指针的值为0x1000,在那里开始。


ARM ARM,ARM架构参考手册(infocenter.arm.com,参考手册,找到适用于ARMv5并下载的手册,这是ARM ARM与ARM和Thumb指令的传统ARM),包含ldm和stm ARM的伪代码关于这些如何使用的完整图片。同样,整本书都是关于手臂和如何编程的。在程序员模型章节前面将介绍所有模式下的所有寄存器等。


如果您正在编程ARM处理器,您应该首先确定(芯片厂商应该告诉您,ARM不会使芯片使芯片厂商的芯片成为芯片厂商的核心)。然后去arm站,找到那个家族的ARM ARM,找到特定内核的TRM(技术参考手册),包括修正版本(如果供应商提供的)(r2p0表示版本2.0(二点零,2p0)),甚至如果存在较新的转速,请使用与设计中使用的供应商所使用的手册。不是每个核心都支持每个指令或模式,TRM告诉您ARM ARM支持的模式和指令,总结了核心所处的整个处理器系列的功能。请注意,ARM7TDMI不是ARMv7,而是ARMv7 ARM9不是ARMv9。 


ARMvNUMBER是家族名称ARM7,ARM11没有v是核心名称。较新的内核具有像Cortex和mpcore这样的名称,而不是ARMNUMBER的东西,这减少了混乱。当然,他们不得不通过制造一个非常不同的系列的ARMv7-m(cortex-MNUMBER)和ARMv7-a(Cortex-ANUMBER)来增加混乱,一个用于重负载,台式机,笔记本电脑等,另一个是微控制器,时钟并在咖啡壶和类似的东西上闪烁的灯光。谷歌beagleboard(Cortex-A)和stm32值行发现板(Cortex-M)得到感觉的差异。或者甚至使用多于千兆赫兹的多核的open-rd.org板,或者来自nvidia的更新的tegra 2,相同的交易超级定标器,多核,多吉赫兹。 cortex-m几乎没有制动100MHz的屏障,并且以千字节测量的内存,尽管如果你想要一个cortex-a的地方,它可能会运行一个电池几个月。


对于很长的帖子很抱歉,希望它是有用的。

What are SP (stack) and LR in ARM?


注:本文内容整合自google/baidu/bing辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:gxnotes#qq.com(#替换为@)。

关键字:ARM  堆栈 引用地址:什么是ARM中的SP(堆栈)和LR?

上一篇:深入理解SP、LR和PC
下一篇:arm架构基础知识小结

推荐阅读最新更新时间:2024-11-13 10:43

arm9x25交叉编译IPTABLES问题与解决
iptables 版本选择 1.4.0, 高版本出现没有入口函数问题, 稍后解决。 下载地址: http://www.netfilter.org/projects/iptables/downloads.html 选择源码iptables-1.4.0.tar.bz2。 解压缩命令:tar -xjvf iptables-1.4.0.tar.bz2. 编译命令:make CC=arm-none-linux-gnueabi-gcc RANLIB=arm-none-linux-gnueabi-ranlib AR=arm-none-linux-gnueabi-ar LD=arm-none-linux-gnueabi-ld
[单片机]
Intel开放22及10纳米制程对ARM架构产品代工
  在2017年的 ARM TechCon大会上,在某些领域已经形成相互争关系的半导体大厂 Intel 和矽智财权厂商AMD,两者宣布将建立广泛的合作关系。在这样的关系下,其中一个相互合作的方式,就是基于 ARM 核心架构的移动芯片,预计将采用 Intel 的22纳米FFL制程技术,以及10纳米的HPM/GP制程技术来进行代工生产。下面就随手机便携小编一起来了解一下相关内容吧。   过去,在 Intel 专注的x86核心架构市场,与 ARM 核心架构专注的移动市场,彼此几乎是不太有所交集。虽然,过去Intel也曾经试图以x86核心架构,进入智能手机领域。而以ARM核心架构为主的高通,也宣布在2017年结合微软Windows10作
[手机便携]
爆料:台积电300人的团队配合苹果自研Arm架构处理器
在今晚苹果的WWDC大会上,除了iOS 14、Mac OS系统之外,最受人关注的一件事便是苹果推出Arm处理器取代使用15年之久的x86处理器了。据悉,苹果公司已经在mac电脑上测试了基于Arm的芯片,发现其性能比英特尔的替代品有了很大提高。 熟悉台积电的供应链消息人士@手机晶片达人在微博上表示,台积电有一个超过300人的专属团队(涵盖研发,设计,先进工艺,封装)在与苹果深度合作开发苹果 PC,NB...等产品下一代的CPU (不是以往的手机AP)。 与此同时,@手机晶片达人还爆料称,苹果觉得目前的绘图芯片功耗都太大,因此也在研发自己的绘图芯片,预计2022完成,采用台积电的N5P工艺。 在过去的几年中,英特尔曾多次出现处
[手机便携]
爆料:台积电300人的团队配合苹果自研<font color='red'>Arm</font>架构处理器
深解ARM最强64位处理器ARMv8架构厉害之处
ARMv8是一个真正意义上的64位,同时这个64位的架构当中加入了或者说提供了32位的支持。 Cortex-A57是ARM最先进、性能最高的应用处理器,而Cortex-A53不仅是功耗效率最高的ARM应用处理器,也是全球最小的64位处理器。这两款处理器可各自独立运作或整合为ARM big.LITTLE处理器架构,以结合高性能与高功耗效率的特点。而ARM的CoreLink 400与CoreLink 500系列系统IP架构解决方案也支持这两款处理器。 Cortex-A53与Cortex-A57处理器(来自ARM官网) ARMv8系列,是ARM史上第一个64位的系列,Cortex-A 57是为智能手机和超级手机功耗级别
[单片机]
深解<font color='red'>ARM</font>最强64位处理器ARMv8架构厉害之处
AP2953在基于ARM架构上网本上的应用介绍
随着网络速度的提升与普及,低价位、续航时间长的上网本愈来愈受到消费者的青睐。ARM架构的上网本以其体积小、重量轻、成本低、功耗小、持久续航力、生产和维护简单而受到很多生产厂商和消费者的瞩目。飞思卡尔(Freescale)、 德州仪器 (TI, Texas Instrument)、安凯(Anyka)、三星(Samsung)等公司基于ARM架构的处理器逐步占据一定市场。ARM架构的上网本通常用两节或三节锂电供电,通过高效率降压DCDC转换成5V电压,再由5V电压转换成3.3V、2.5V、1.8V、1.2V等电压给系统内部各个部分供电。ARM架构的上网本供电结构如下:    图1:ARM架构的上网本供电结构。 突出上网本的持久续航优
[嵌入式]
常用 ARM指令集及汇编
一、 ARM处理器的寻址方式 二、指令集学习 (一) ARM 指令集 1. 指令格式 2. 条件码 3. ARM 存储器访问指令 1) LDR/ STR -加载 /存储指令 2) LDM/ STM -多寄存器加载 /存储指令 3) SWP -寄存器和存储器交换指令 4. ARM 数据处理指令 1) 数据传送指令 a) MOV -数据传送指令 b) MVN -数据非传送指令 2) 算术逻辑运算指令 a) ADD -加法运算指令 b) SUB -减法运算指令 c) RSB- 逆向减法指令 d) ADC -带进位加法指令 e) SBC -带进位减法指令 f) RSC -带进位逆向减法指令 g) AND
[单片机]
基于ARM的智能家居路由系统
  前言   智能家居,或称智能住宅,在英文中常用Smart Home。智能家居是以住宅为平台,兼备建筑、网络通信、信息家电、设备自动化,集系统、结构、服务、管理为一体的高效、舒适、安全、便利、环保的居住环境。智能家居可以定义为一个过程或者一个系统。它利用先进的计算机技术、网络通讯技术、综合布线技术、将与家居生活有关的各种子系统,有机地结合在一起,通过统筹管理,让家居生活更加舒适、安全、有效。   在智能家居中,有一个重要系统就是家庭网络,它是在家庭或者小区范围内,将PC、家电、安全系统、照明系统和广域网相连接的一种新技术。当前在家庭网络所采用的连接技术可以分为“有线”和“无线”两大类。有线方案主要包括:双绞线或同轴电缆连接、
[单片机]
arm拟出售在华子公司51%权益
  有报道称,软银旗下芯片制造商arm将作价7.75亿美元,向直接投资者出售在华子公司arm Technology China 51%权益。此前媒体报道显示,基于arm指令集生产的芯片几乎垄断了嵌入式和移动端的市场。上市公司中,中科创达与arm合资成立了安创空间,共同拓展在智能硬件生态系统中的影响力,中科创达持股51%。全志科技和arm、地平线机器人联合发起开放人工智能实验室。
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved