pax*_*blo 91
堆栈是一个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
Run Code Online (Sandbox Code Playgroud)
现在让我们按照执行情况,描述上面评论中显示的步骤:
希望从那个描述中,它将变得清晰.底线是:堆栈对于以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)
Rob*_*vey 11
堆栈指针存储推入堆栈的最新条目的地址.
要将值压入堆栈,堆栈指针将递增以指向下一个物理内存地址,并将新值复制到内存中的该地址.
要从堆栈中弹出值,将从堆栈指针的地址复制该值,并递减堆栈指针,将其指向堆栈中的下一个可用项目.
硬件堆栈最典型的用途是存储子程序调用的返回地址.子程序完成执行后,返回地址从堆栈顶部弹出并放入程序计数器寄存器,使处理器在调用子程序后的下一条指令处继续执行.
http://en.wikipedia.org/wiki/Stack_%28data_structure%29#Hardware_stacks
你有更多准备[为考试]做;-)
堆栈指针是一个寄存器,用于保存堆栈中下一个可用点的地址.
堆栈是内存中的一个区域,用于存储堆栈,即LIFO(后进先出)类型的容器,我们存储局部变量和返回地址,允许简单管理函数调用的嵌套.一个典型的程序.
有关堆栈管理的基本说明,请参阅此Wikipedia文章.
| 归档时间: |
|
| 查看次数: |
105834 次 |
| 最近记录: |