当前位置:首页 » 服务存储 » 什么存储器记录栈帧的顶部
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

什么存储器记录栈帧的顶部

发布时间: 2022-09-02 09:53:43

存储系统层次结构包含哪些层

第一层:通用寄存器堆 第二层:指令与数据缓冲栈 第三层:高速缓冲存储器 第四层:主储存器(DRAM) 第五层:联机外部储存器(硬磁盘机) 第六层:脱机外部储存器(磁带、光盘存储器等) 这就是存储器的层次结构~~~ 主要体现在访问速度~~~ 1,设置多个存储器并且使他们并行工作。本质:增添瓶颈部件数目,使它们并行工作,从而减缓固定瓶颈。 2,采用多级存储系统,特别是Cache技术,这是一种减轻存储器带宽对系统性能影响的最佳结构方案。本质:把瓶颈部件分为多个流水线部件,加大操作时间的重叠、提高速度,从而减缓固定瓶颈。 3,在微处理机内部设置各种缓冲存储器,以减轻对存储器存取的压力。增加CPU中寄存器的数量,也可大大缓解对存储器的压力。本质:缓冲技术,用于减缓暂时性瓶颈。

❷ 什么情况下会用到栈

栈可以用来在函数调用的时候存储断点,做递归时要用到栈!

首先 系统或者数据结构栈中数据内容的读取 与 (压入push和 弹出pop) 是两回事! 插入是增加数据 弹出 是删除数据 ,这些操作只能从栈顶即最低地址作为约束的接口界面入手操作 ,但读取栈中的数据 是随便的 没有接口约束之说。很多人都误解这个理念从而对栈产生困惑。[1]而系统栈在计算机体系结构中 又起到一个跨部件交互的媒介区域的作用 即 cpu 与内存的交流通道 ,cpu只从系统给我们自己编写的应用程序所规定的栈入口线性地读取执行指令, 用一个形象的词来形容它就是pipeline(管道线、流水线)。cpu内部交互具体参见 EU与BIU的概念介绍。

栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。

栈可以用来在函数调用的时候存储断点,做递归时要用到栈!

以上定义是在经典计算机科学中的解释。

在计算机系统中,栈则是一个具有以上属性的动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。在i386机器中,栈顶由称为esp的寄存器进行定位。压栈的操作使得栈顶的地址减小,弹出的操作使得栈顶的地址增大。

栈在程序的运行中有着举足轻重的作用。最重要的是栈保存了一个函数调用时所需要的维护信息,这常常称之为堆栈帧或者活动记录。堆栈帧一般包含如下几方面的信息:

1.函数的返回地址和参数

2. 临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。




❸ 什么是高速缓冲存储器在计算机系统中它是如何发挥作用的

高速缓冲存储器(Cache)实际上是为了把由DRAM组成的大容量内存储器都看做是高速存储器而设置的小容量局部存储器,一般由高速SRAM构成。这种局部存储器是面向CPU的,引入它是为减小或消除CPU与内存之间的速度差异对系统性能带来的影响。Cache 通常保存着一份内存储器中部分内容的副本(拷贝),该内容副本是最近曾被CPU使用过的数据和程序代码。Cache的有效性是利用了程序对存储器的访问在时间上和空间上所具有的局部区域性,即对大多数程序来说,在某个时间片内会集中重复地访问某一个特定的区域。如PUSH/POP指令的操作都是在栈顶顺序执行,变量会重复使用,以及子程序会反复调用等,就是这种局部区域性的实际例证。因此,如果针对某个特定的时间片,用连接在局部总线上的Cache代替低速大容量的内存储器,作为CPU集中重复访问的区域,系统的性能就会明显提高。
系统开机或复位时,Cache 中无任何内容。当CPU送出一组地址去访问内存储器时,访问的存储器的内容才被同时“拷贝”到Cache中。此后,每当CPU访问存储器时,Cache 控制器要检查CPU送出的地址,判断CPU要访问的地址单元是否在Cache 中。若在,称为Cache 命中,CPU可用极快的速度对它进行读/写操作;若不在,则称为Cache未命中,这时就需要从内存中访问,并把与本次访问相邻近的存储区内容复制到 Cache 中。未命中时对内存访问可能比访问无Cache 的内存要插入更多的等待周期,反而会降低系统的效率。而程序中的调用和跳转等指令,会造成非区域性操作,则会使命中率降低。因此,提高命中率是Cache 设计的主要目标。

❹ "栈"和"栈帧"这两个概念到底如何区分

1、栈:FILO先进后出的数据结构

栈底是第一个进栈的数据的位置(压箱底)

栈顶是最后一个进栈的数据位置

2、根据SP指针指向的位置,栈可分为满栈和空栈

满栈:当sp指针总是指向最后压入堆栈的数据(ARM采用满栈)


栈的作用:

1)保存局部变量

分析代码:

[html]view plain

  • #include<stdio.h>

  • intmain()

  • {

  • inta;

  • a++;

  • returna;

  • }</span>


  • 反汇编之后的代码;

    [html]view plain

  • stack:fileformatelf32-littlearm

  • Disassemblyofsection.text:

  • 00000000<main>:

  • #include<stdio.h>

  • intmain()

  • {

  • 0:e52db004push{fp};(strfp,[sp,#-4]!)@将栈帧底部指针FP压入栈中;创建属于main函数的栈帧。

  • 4:e28db000addfp,sp,#0;0x0@fp指针为函数栈帧的底部,

  • 8:e24dd00csubsp,sp,#12;0xc@sp指针为栈帧的顶部,同时为栈的栈顶。

  • inta;

  • a++;

  • c:e51b3008ldrr3,[fp,#-8]@由此三句可知变量a在栈帧中执行了加法操作,及栈帧具有保存局部变量的作用

  • 10:e2833001addr3,r3,#1;0x1

  • 14:e50b3008strr3,[fp,#-8]

  • returna;

  • 18:e51b3008ldrr3,[fp,#-8]

  • }

  • </span>



  • 2)保存函数的参数

    分析代码:

    [html]view plain

  • <spanstyle="font-size:18px;">#include<stdio.h>

  • voidfunc1(inta,intb,intc,intd,inte,intf)

  • {

  • intk;

  • k=e+f;

  • }

  • intmain()

  • {

  • func1(1,2,3,4,5,6);

  • return0;

  • }

  • 反汇编之后的代码;

  • voidfunc1(inta,intb,intc,intd,inte,intf)@多于4个参数

  • {

  • 0:e52db004push{fp};(strfp,[sp,#-4]!)@保存main函数的栈帧底部指针FP

  • 4:e28db000addfp,sp,#0;0x0

  • 8:e24dd01csubsp,sp,#28;0x1c@由栈帧顶部指针SP创建一片栈帧保存子函数的前四个参数

  • c:e50b0010strr0,[fp,#-16]@a

  • 10:e50b1014strr1,[fp,#-20]@b

  • 14:e50b2018strr2,[fp,#-24]@c

  • 18:e50b301cstrr3,[fp,#-28]@d

  • intk;

  • k=e+f;

  • 1c:e59b3004ldrr3,[fp,#4]@在子函数的栈帧中实现第五个参数与第六个参数的运算

  • 20:e59b2008ldrr2,[fp,#8]@由ldrr2,[fp,#8]知参数保存在main函数的栈帧中,并运算

  • 24:e0833002addr3,r3,r2@以子函数的栈帧底部指针(fp)做参考坐标实现对参数的查找

  • 28:e50b3008strr3,[fp,#-8]

  • }

  • 2c:e28bd000addsp,fp,#0;0x0

  • 30:e8bd0800pop{fp}

  • 34:e12fff1ebxlr

  • 00000038<main>:

  • intmain()

  • {

  • 38:e92d4800push{fp,lr}@由于调用子函数,先保存main函数的栈帧底部指针FP和返回地址LR(当前PC指针的下一地址)

  • 3c:e28db004addfp,sp,#4;0x4@可知先压入FP,后压入lr.把此时子函数(被调用者)的栈帧底部指针FP指向保存在子函数栈帧的main函数(调用者)的栈帧底部指针FP

  • 40:e24dd008subsp,sp,#8;0x8@创建栈

  • func1(1,2,3,4,5,6);

  • 44:e3a03005movr3,#5;0x5

  • 48:e58d3000strr3,[sp]

  • 4c:e3a03006movr3,#6;0x6

  • 50:e58d3004strr3,[sp,#4]

  • 54:e3a00001movr0,#1;0x1@用通用寄存器保存前四个参数的值

  • 58:e3a01002movr1,#2;0x2

  • 5c:e3a02003movr2,#3;0x3

  • 60:e3a03004movr3,#4;0x4

  • 64:ebfffffebl0<func1>

  • return0;

  • 68:e3a03000movr3,#0;0x0

  • }

  • 6c:e1a00003movr0,r3

  • 70:e24bd004subsp,fp,#4;0x4

  • 74:e8bd4800pop{fp,lr}

  • 78:e12fff1ebxlr</span>


  • 注:C中,若函数的参数小于等于4个,则用通用寄存器保存其参数值,多于4个的参数保存在栈中

    3)保存寄存器的值

    分析代码:

    [html]view plain

  • <spanstyle="font-size:18px;">include<stdio.h>

  • voidfunc2(inta,intb)

  • {

  • intk;

  • k=a+b;

  • }

  • voidfunc1(inta,intb)

  • {

  • intc;

  • func2(3,4);

  • c=a+b;

  • }

  • intmain()

  • {

  • func1(1,2);

  • return0;

  • }</span>


  • 反汇编之后的代码;

    [html]view plain

  • <spanstyle="font-size:18px;">voidfunc2(inta,intb)

  • {

  • 0:e52db004push{fp};(strfp,[sp,#-4]!)

  • 4:e28db000addfp,sp,#0;0x0

  • 8:e24dd014subsp,sp,#20;0x14

  • c:e50b0010strr0,[fp,#-16]@保存寄存器的值

  • 10:e50b1014strr1,[fp,#-20]

  • intk;

  • k=a+b;

  • 14:e51b3010ldrr3,[fp,#-16]

  • 18:e51b2014ldrr2,[fp,#-20]

  • 1c:e0833002addr3,r3,r2

  • 20:e50b3008strr3,[fp,#-8]

  • }

  • 24:e28bd000addsp,fp,#0;0x0

  • 28:e8bd0800pop{fp}

  • 2c:e12fff1ebxlr

  • 00000030<func1>:

  • voidfunc1(inta,intb)

  • {

  • 30:e92d4800push{fp,lr}

  • 34:e28db004addfp,sp,#4;0x4

  • 38:e24dd010subsp,sp,#16;0x10

  • 3c:e50b0010strr0,[fp,#-16]@代码44行调用func2函数后,又使用r0 1保存参数,所以此时将r0 1寄存器的

  • 40:e50b1014strr1,[fp,#-20]@值放入栈中

  • intc;

  • func2(3,4);

  • 44:e3a00003movr0,#3;0x3

  • 48:e3a01004movr1,#4;0x4

  • 4c:ebfffffebl0<func2>

  • c=a+b;

  • 50:e51b3010ldrr3,[fp,#-16]

  • 54:e51b2014ldrr2,[fp,#-20]

  • 58:e0833002addr3,r3,r2

  • 5c:e50b3008strr3,[fp,#-8]

  • }

  • 60:e24bd004subsp,fp,#4;0x4

  • 64:e8bd4800pop{fp,lr}

  • 68:e12fff1ebxlr

  • 0000006c<main>:

  • intmain()

  • {

  • 6c:e92d4800push{fp,lr}

  • 70:e28db004addfp,sp,#4;0x4

  • func1(1,2);

  • 74:e3a00001movr0,#1;0x1

  • 78:e3a01002movr1,#2;0x2

  • 7c:ebfffffebl30<func1>

  • return0;

  • 80:e3a03000movr3,#0;0x0

  • }

  • 84:e1a00003movr0,r3

  • 88:e24bd004subsp,fp,#4;0x4

  • 8c:e8bd4800pop{fp,lr}

  • 90:e12fff1ebxlr</span>


  • 初始化栈:即对SP指针赋予一个内存地址(统一标准:2440、6410、210)

    在内存的64MB位置即ldr sp, =0x34000000(2440)

    ldr sp, =0x54000000(6410)

    ldr sp, =0x24000000(210)

    由上可知ARM采用满栈(指向刚入栈的数据)、降栈(由高地址向低地址入栈)

    问题:因为ARM不同工作模式有不同的栈,定义栈的技巧是什么,避免定义相同的地址使用不同栈?

    转自:http://blog.csdn.net/u011467781/article/details/39559737

❺ 计算机内,配置高速缓冲存储器(CACHE)是为了解决什么

B,CPU与内存储器之间速度不匹配问题。

高速缓冲存储器(Cache)其原始意义是指存取速度比一般随机存取记忆体(RAM)来得快的一种RAM,一般而言它不像系统主记忆体那样使用DRAM技术,而使用昂贵但较快速的SRAM技术,也有快取记忆体的名称。

高速缓冲存储器是存在于主存与CPU之间的一级存储器, 由静态存储芯片(SRAM)组成,容量比较小但速度比主存高得多, 接近于CPU的速度。在计算机存储系统的层次结构中,是介于中央处理器和主存储器之间的高速小容量存储器。它和主存储器一起构成一级的存储器。高速缓冲存储器和主存储器之间信息的调度和传送是由硬件自动进行的。

(5)什么存储器记录栈帧的顶部扩展阅读:

高速缓冲存储器组成结构

高速缓冲存储器是存在于主存与CPU之间的一级存储器, 由静态存储芯片(SRAM)组成,容量比较小但速度比主存高得多, 接近于CPU的速度。

主要由三大部分组成:

1、Cache存储体:存放由主存调入的指令与数据块。

2、地址转换部件:建立目录表以实现主存地址到缓存地址的转换。

3、替换部件:在缓存已满时按一定策略进行数据块替换,并修改地址转换部件。

❻ 栈只能顺序存储,这句话对吗,为什么

栈只能顺序存储,这句话不对。栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom)。

一个新元素只能从栈顶一端进入,删除时,只能删除栈顶的元素,即刚刚被插入的元素。所以栈也称为后进先出表。线性表可以顺序存储,也可以链式存储,因此栈也可以采用链式存储结构。



(6)什么存储器记录栈帧的顶部扩展阅读:

栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。

在计算机系统中,栈则是一个具有以上属性的动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。在i386机器中,栈顶由称为esp的寄存器进行定位。压栈的操作使得栈顶的地址减小,弹出的操作使得栈顶的地址增大。

栈在程序的运行中有着举足轻重的作用。最重要的是栈保存了一个函数调用时所需要的维护信息,这常常称之为堆栈帧或者活动记录。堆栈帧一般包含如下几方面的信息:

1、函数的返回地址和参数。

2、临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。

链式存储结构的特点:

1、比顺序存储结构的存储密度小(链式存储结构中每个结点都由数据域与指针域两部分组成,相比顺序存储结构增加了存储空间)。

2、逻辑上相邻的节点物理上不必相邻。

3、插入、删除灵活 (不必移动节点,只要改变节点中的指针)。

4、查找节点时链式存储要比顺序存储慢。

5、每个节点是由数据域和指针域组成。

6、由于簇是随机分配的,这也使数据删除后覆盖几率降低,恢复可能提高。

顺序存储结构的主要优点是节省存储空间,因为分配给数据的存储单元全用存放结点的数据(不考虑c/c++语言中数组需指定大小的情况),结点之间的逻辑关系没有占用额外的存储空间。

采用这种方法时,可实现对结点的随机存取,即每一个结点对应一个序号,由该序号可以直接计算出来结点的存储地址。但顺序存储方法的主要缺点是不便于修改,对结点的插入、删除运算时,可能要移动一系列的结点。

参考资料:网络-栈

参考资料:网络-链式存储结构

参考资料:网络-顺序存储结构

❼ 栈结构通常采用的两种储存结构是和

顺序存储和链接存储,通称顺序队列和链队列,

是计算机科学中一种特殊的串行形式的抽象数据类型,其特殊之处在于只能允许在链表或数组的一端(称为堆栈顶端指针,英语:top)。

进行加入数据(英语:push)和输出数据(英语:pop)的运算。另外堆栈也可以用一维数组或链表的形式来完成。堆栈的另外一个相对的操作方式称为队列。

由于堆栈数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作。

堆栈数据结构使用两种基本操作:推入(压栈,push)和弹出(弹栈,pop):

推入:将数据放入堆栈的顶端(数组形式或串行形式),堆栈顶端top指针加一。

弹出:将顶端数据数据输出(回传),堆栈顶端数据减一。


(7)什么存储器记录栈帧的顶部扩展阅读:

堆栈是一个特定的存储区或寄存器,它的一端是固定的,另一端是浮动的。对这个存储区存入的数据,是一种特殊的数据结构。所有的数据存入或取出,只能在浮动的一端(称栈顶)进行,严格按照“后进先出”的原则存取,位于其中间的元素。

必须在其栈上部(后进栈者)诸元素逐个移出后才能取出。在内存储器 (随机存储器) 中开辟一个区域作为堆栈,叫软件堆栈; 用寄存器构成的堆栈,叫硬件堆栈。堆栈处理器就是一种硬件堆栈相对寄存器文件处理器来讲。

它具有很多优点系统复杂度低;精简的指令集;芯片面积小;寻址方式简单;代码体积小;快速的中断响应,子程序调用能力。这些优点使得堆栈处理器在工业控制领域和航空航天领域有着不可替代的地位。

❽ 汇编中堆栈的理解

你可以把栈理解成一个暂时存放东西的东西
比如你想用AX这个寄存器,但是又不想把AX里原来的数据弄丢了
这时就可以用栈了
先用push指令把ax压入栈顶
然后就可以用ax这个寄存器了,用完之后用pop指令把原先压倒栈里的ax里的数据弹出来
对于这个栈,在 8086 CPU 里有两个专用的寄存器: SS 和 SP ,这两个寄存器用于指向内存中的栈顶

❾ 带链栈怎么运算可以有top=bottom=20,如图

一个,top=bottom=20表示栈顶和栈底指向同一个地址,中间没有其他的元素,就只剩一个同时指向的元素了。

栈的顺序存储空间为S(1:50),初始状态为top=0。现经过一系列入栈与退栈运算后,top=20,则栈顶-栈底=20-0=20个元素。

栈是向上增长的,每次压入一个元素,栈的TOP指针向上移动一位。当压入第一个元素时,TOP指针指向m+1-1 = m当压入第二个元素时,TOP指针指向m+1-2 = m-1。以此类推,当压入第N个元素时,TOP指针指向m+1-N = 20则N = m+1-20 = m-19。

(9)什么存储器记录栈帧的顶部扩展阅读:

在计算机系统中,栈则是一个具有以上属性的动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。在i386机器中,栈顶由称为esp的寄存器进行定位。压栈的操作使得栈顶的地址减小,弹出的操作使得栈顶的地址增大。

栈在程序的运行中有着举足轻重的作用。最重要的是栈保存了一个函数调用时所需要的维护信息,这常常称之为堆栈帧或者活动记录。堆栈帧一般包含如下几方面的信息:

1、函数的返回地址和参数

2、临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。

❿ 最近学习ucos2,关于任务栈哪边是栈顶哪边是栈底的问题

可不可以这样理解:
OSTCBStkBottom :指向栈的可用空间的最高(最低)地址
top --> 指向当前可以使用的单元
bottom就像是一条界限,不管栈的方向是递增还是递减,top指针都不能越过bottom指针