什么是微处理器中使用的堆栈指针?
我正准备参加微处理器考试。 如果使用程序计数器来保存下一条指令的地址,那么堆栈指针的用途是什么?
一个堆栈是一个LIFO(后进先出 - 您推入堆栈的最后一个条目是您弹出时返回的第一个条目)数据结构,通常用于保存堆栈帧(属于当前的功能)。
这包括但不限于:
您将物品推入堆叠并将其弹出。 在微处理器中,堆栈可用于用户数据(如本地变量和传递的参数)和CPU数据(如调用子例程时的返回地址)。
堆栈的实际实现取决于微处理器架构。 它可以在内存中长大或缩小,并且可以在推送/弹出操作之前或之后移动。
通常影响堆栈的操作是:
考虑我的(虚构的)汇编语言中的以下程序:
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
现在我们来看看执行过程,描述上面评论中显示的步骤:
希望从这个描述中,它将变得清晰。 底线是:堆栈对于以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