堆栈在微处理器中的作用是什么?

时间:2009-07-11 16:21:52

标签: computer-science microprocessors

堆栈在微处理器中的作用是什么?

10 个答案:

答案 0 :(得分:7)

堆栈主要在函数调用期间使用,但根据编程的语言和级别,它可用于临时存储处理器寄存器数据或其他变量。

此外,当使用递归函数将堆栈存储在堆栈中并再次调用自身时,堆栈也可用于短期大规模存储数据。

generic use of stack适用于

  1. 寄回地址
    • 返回值
    • 调用函数的参数
    • 被调用函数中的局部变量
    • 将在被调用函数中重用的处理器寄存器
  2. 而且,是的,堆栈也用于漏洞利用 将返回地址传递给被调用函数返回的性质, 再加上C语言中数组边界检查的弱点,给出了一个非常好的结果 在易受攻击(不安全编写)程序的堆栈中导致 buffer overflows 的好方法。

答案 1 :(得分:4)

在最低级别,堆栈是某些指令存储或检索数据的位置,以及发生中断时存储数据的位置。微处理器有所不同,但有5种常规类型的堆栈特定指令:

  1. PUSH - 将数据放入堆栈
  2. POP(或PULL) - 从堆栈中“删除”数据
  3. CALL - 跳转到子程序并将返回地址放在堆栈上
  4. RETURN - 通过使用堆栈顶部
  5. 加载程序计数器从子程序返回
  6. INT(或SWI) - 软件中断;专门的CALL
  7. 当发生处理器中断时(由于外部设备),CPU将保存当前程序计数器和(通常)堆栈上的标志寄存器并跳转到处理子程序。这允许处理子程序处理中断并返回到CPU正在执行的任何事情,并保留其当前状态。

    虽然微处理器一次只有一个堆栈处于活动状态,但操作系统可以使其看起来好像有多个堆栈。至少一个用于OS,每个进程一个,每个线程一个。实际上,线程本身可以实现多个堆栈。

    在更高的层次上,无论使用什么语言来实现一个线程,都会经常使用堆栈来存储函数调用参数,局部变量和函数调用返回值(在这里大致说一下 - 参考你的语言'具体细节的低级文档。)

    这样就得出了我自下而上对堆栈的解释。

答案 2 :(得分:2)

在计算的早期阶段,子程序调用是通过在每个子程序中加上一个内存RAM来指示它的调用位置来处理的。要调用子例程,可以执行以下操作:

  load foo_return with #LABEL_123
  goto foo
#LABEL_123:
  ...code to execute after return from foo


foo:
  ... do stuff
  goto foo_return

可以通过让调用者将返回地址放入寄存器并使例程将其存储到条目上的“返回”点来优化此模式。这种模式有效,但它有一些问题。它不仅通常浪费内存 - 它也无法处理递归或重入代码。添加堆栈使得可以通过让调用者简单地说“在适当的地方存储返回地址”而不干扰任何先前的地址来简化代码,并且被调用的函数简单地说“返回到最近没有的调用者”已经回到了“。这允许开发可重入代码,并且意味着只需要存储足够的返回地址来处理实际发生的最深嵌套函数调用。

答案 3 :(得分:1)

这取决于微处理器。一般来说,它的作用是保持局部变量和函数的参数。

实际上它不在微处理器中,而是在中央存储器中。

答案 4 :(得分:1)

在函数调用期间,堆栈用于存储和检索返回地址。它在嵌套函数调用或递归函数调用期间得到了很好的利用。它还用于将参数传递给函数

在微处理器上,它还用于在上下文切换之前存储状态寄存器内容

欢呼声

答案 5 :(得分:0)

某些微处理器具有堆栈寄存器以提高效率,请查看维基百科中的SPARC article;其他人为微型车辆提供微型支架......事实上,这是一个非常广泛的术语。

答案 6 :(得分:0)

http://www.hobbyprojects.com/microprocessor_systems/images/stack.gif

堆栈是数据的临时存储。

CPU可以将重要数据推入堆栈,同时处理其他数据。

完成该任务后,它会将保存的数据从堆栈中删除。

它就像一堆盘子。 底板是第一个被压入堆栈的数据。 顶板是最后推送的数据。 首先拉动顶板,底板是最后拉出的数据。 这是一个最后的,第一个出栈。

在图表中,X是第一个被推,然后是Y,最后是A. CPU消失处理其他数据。 完成该任务后,它将返回以提取已保存的数据。 先拉A,然后是Y,最后是X.

推送数据的指令是PHA。 只有累加器中的数据才能被压入堆栈。 如果先将其他数据传输到累加器,则可以推送其他数据。

从堆栈中提取数据的指令是PLA。 堆栈上的数据传输到累加器。

6502堆栈由256个字节组成,占用第1页,地址256到511。

答案 7 :(得分:0)

为了补充一些这些答案,一些低端微处理器(如PIC线)有一个硬件 callstack,这意味着它不能像硬件一样动态分配。

这样做的含义是,在堆耗尽之前,你只能进行如此多的函数调用;当然,软件也是如此,但通常基于硬件的堆栈可能非常有限,并且可能需要您重新考虑您的程序,以便“压缩”您的函数调用。

答案 8 :(得分:0)

堆栈是LIFO(后进先出)缓冲区的实现。 FIFO(先进先出)也称为队列。但回到LIFO。

x86架构中的堆栈允许软件设计人员省去RISC处理器中的返回地址寄存器和中断返回地址寄存器等奇怪的东西。 Everything 可以驻留在堆栈上,这意味着有一个标准化的统一方法来处理调用/返回,参数/局部变量和中断/中断返回。在单独的堆栈上使用该方法简化了多线程的实现。

相比之下,RISC使用类似堆栈的缓冲区,尽管它们在其他地方保留了相关信息的重要部分。 RISC“堆栈”可能更快(不确定),但它们肯定比x86更难理解。

答案 9 :(得分:-5)

实际上堆栈不是处理器的术语,它用于语言例程调用。例程可以使用堆栈来获取参数并保存局部变量,也可以调用其他例程。