什么是微处理器中使用的堆栈指针?

我正准备参加微处理器考试。 如果使用程序计数器来保存下一条指令的地址,那么堆栈指针的用途是什么?


一个堆栈是一个LIFO(后进先出 - 您推入堆栈的最后一个条目是您弹出时返回的第一个条目)数据结构,通常用于保存堆栈帧(属于当前的功能)。

这包括但不限于:

  • 返回地址。
  • 一个返回值的地方。
  • 传递参数。
  • 局部变量。
  • 您将物品推入堆叠并将其弹出。 在微处理器中,堆栈可用于用户数据(如本地变量和传递的参数)和CPU数据(如调用子例程时的返回地址)。

    堆栈的实际实现取决于微处理器架构。 它可以在内存中长大或缩小,并且可以在推送/弹出操作之前或之后移动。

    通常影响堆栈的操作是:

  • 子程序调用和返回。
  • 中断调用和返回。
  • 代码明确推送和弹出条目。
  • 直接操纵SP寄存器。
  • 考虑我的(虚构的)汇编语言中的以下程序:

    Addr  Opcodes   Instructions    ; Comments
    ----  --------  --------------  ----------
                                    ; 1: pc<-0000, sp<-8000
    0000  01 00 07  load r0,7       ; 2: pc<-0003, r0<-7
    0003  02 00     push r0         ; 3: pc<-0005, sp<-7ffe, (sp:7ffe)<-0007
    0005  03 00 00  call 000b       ; 4: pc<-000b, sp<-7ffc, (sp:7ffc)<-0008
    0008  04 00     pop r0          ; 7: pc<-000a, r0<-(sp:7ffe[0007]), sp<-8000
    000a  05        halt            ; 8: pc<-000a
    000b  06 01 02  load r1,[sp+2]  ; 5: pc<-000e, r1<-(sp+2:7ffe[0007])
    000e  07        ret             ; 6: pc<-(sp:7ffc[0008]), sp<-7ffe
    

    现在我们来看看执行过程,描述上面评论中显示的步骤:

  • 这是程序计数器为零且堆栈指针为8000(所有这些数字均为十六进制)的起始条件。
  • 这只是加载寄存器r0的立即值7并移到下一步(我假设你知道默认行为将移动到下一步,除非另有说明)。
  • 这通过将堆栈指针减少2来将r0推入堆栈,然后将该寄存器的值存储到该位置。
  • 这就调用了一个子程序。 程序计数器会以与上一步中的r0类似的方式推入堆栈,然后将程序计数器设置为其新值。 这与用户级别的推动没有什么不同,除了它作为系统级别的事情更多地完成之外。
  • 这从从堆栈指针计算的内存位置加载r1 - 它显示了一种将参数传递给函数的方法。
  • return语句从堆栈指针指向的位置提取值并将其加载到程序计数器中,同时调整堆栈指针。 这就像系统级别的弹出窗口(参见下一步)。
  • 从堆栈中弹出r0包括从堆栈指针指向的位置提取值,然后调整堆栈指针。
  • 暂停指令简单地将程序计数器留在原来的位置,是一个无限循环。
  • 希望从这个描述中,它将变得清晰。 底线是:堆栈对于以LIFO方式存储状态非常有用,这对于大多数微处理器执行子程序调用的方式来说是非常理想的。

    除非你是SPARC,在这种情况下,你可以为你的堆栈使用循环缓冲区:-)

    更新:只是为了澄清在上面的示例中推送和弹出值(无论是显式还是通过调用/返回)所采取的步骤,请参阅以下示例:

    LOAD R0,7
    PUSH R0
                         Adjust sp       Store val
    sp-> +--------+      +--------+      +--------+
         |  xxxx  |  sp->|  xxxx  |  sp->|  0007  |
         |        |      |        |      |        |
         |        |      |        |      |        |
         |        |      |        |      |        |
         +--------+      +--------+      +--------+
    
    POP R0
                         Get value       Adjust sp
         +--------+      +--------+  sp->+--------+
    sp-> |  0007  |  sp->|  0007  |      |  0007  |
         |        |      |        |      |        |
         |        |      |        |      |        |
         |        |      |        |      |        |
         +--------+      +--------+      +--------+
    

    堆栈指针存储被推入堆栈的最近条目的地址。

    要将值压入堆栈,堆栈指针会递增以指向下一个物理内存地址,并将新值复制到内存中的该地址。

    要从堆栈中弹出一个值,该值将从堆栈指针的地址复制而来,堆栈指针会递减,并将其指向堆栈中的下一个可用项目。

    硬件堆栈最典型的用途是存储子程序调用的返回地址。 当子程序完成执行时,返回地址从堆栈顶部弹出并置于程序计数器寄存器中,导致处理器在调用子程序之后的下一条指令处继续执行。

    http://en.wikipedia.org/wiki/Stack_%28data_structure%29#Hardware_stacks


    你有更多的准备[考试]做;-)

    堆栈指针是一个寄存器,用于保存堆栈中下一个可用点的地址。

    堆栈是内存中的一个区域,用于存储堆栈,即LIFO(后进先出)类型的容器,我们存储局部变量和返回地址,允许简单地管理函数调用的嵌套一个典型的程序。

    请参阅此维基百科文章以获取堆栈管理的基本说明。

    链接地址: http://www.djcxy.com/p/80363.html

    上一篇: What is a stack pointer used for in microprocessors?

    下一篇: x86 Assembly two jump instructions with the same target