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

49 stack microprocessors

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

pax*_*blo 91

堆栈是一个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
Run Code Online (Sandbox Code Playgroud)

现在让我们按照执行情况,描述上面评论中显示的步骤:

  1. 这是程序计数器为零且堆栈指针为8000(所有这些数字均为十六进制)的起始条件.
  2. 这只是简单地加载寄存器r0的立即值7并移动到下一步(我假设您理解默认行为将移动到下一步,除非另有说明).
  3. 这会将堆栈指针减少2,然后将寄存器的值存储到该位置,从而将r0压入堆栈.
  4. 这称为子程序.什么被程序计数器被压入堆栈以类似的方式来R0在上一步中,然后将程序计数器设置为它新的价值.这与用户级推送没有什么不同,除了它更多地作为系统级别的事情.
  5. 这将从堆栈指针计算的内存位置加载r1 - 它显示了将参数传递给函数的方法.
  6. return语句从堆栈指针指向的位置提取值并将其加载到程序计数器中,同时调整堆栈指针.这就像系统级弹出(见下一步).
  7. 从堆栈弹出r0涉及从堆栈指针指向的位置提取值,然后向上调整堆栈指针.
  8. 暂停指令只是将程序计数器留在原处,无穷无尽的循环.

希望从那个描述中,它将变得清晰.底线是:堆栈对于以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  |
     |        |      |        |      |        |
     |        |      |        |      |        |
     |        |      |        |      |        |
     +--------+      +--------+      +--------+
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是各种胜利. (3认同)

Rob*_*vey 11

堆栈指针存储推入堆栈的最新条目的地址.

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

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

硬件堆栈最典型的用途是存储子程序调用的返回地址.子程序完成执行后,返回地址从堆栈顶部弹出并放入程序计数器寄存器,使处理器在调用子程序后的下一条指令处继续执行.

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


mjv*_*mjv 6

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

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

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

有关堆栈管理的基本说明,请参阅此Wikipedia文章.