EMU618社区

 找回密码
 立即注册
搜索
查看: 1919|回复: 0

[转载HACK教程] 堆栈及其使用(概念篇)[作者:sossb]

 关闭 [复制链接]

签到天数: 2192 天

[LV.Master]伴坛终老

发表于 2009-3-10 02:36:17 | 显示全部楼层 |阅读模式
堆栈及其使用(概念篇)
# U% W% O7 p$ D9 Q1 I% K! B, a  一般计算机都要在随机储存器RAM中开辟出某个区域用于重要数据的储存。但这个区域中数据的存取方式却和RAM中其他区域有着不同的规则:它必须遵从“先进后出”,或称“后进先出”的原则,不能无顺序随意存取。这块存储区称作堆栈。' o& \, H! f+ y
  在堆放货物的栈仓里,比如粮食,先来的货物放在最下面,后来的货物依次向上堆放,越码越高。在需要取出货物的时候,不能先取最早放入的、堆在下面的货物,只能先把最后放入的、放在货堆顶端的货搬下来。这样逐次向下取货搬出,最先放的货要等到最后才能搬出,这就是后进先出原则。$ j7 \' ^& D7 B2 z4 T
  计算机使用堆栈也如此。需要把数据存入堆栈(称为进栈)时,数据是依次进栈的,它们在内存中用相邻的存储单元。在需要把这些数据从栈中取出时,必须先取出最后进栈的数据,而最先进栈的那个数据却要在最后才能被取出。取出数据称为出栈。$ `# F& K3 x, c" R3 _" O+ f  [0 Y
  6502规定堆栈设置在内存的第一页,也就是地址码字节约$01的存储区域,它从存储单元$0100到$01FF共256个存储单元。堆栈的栈底是$01FF单元(第一个进栈数要存入$01FF)。
" X+ |. [6 h1 N, w5 g! x0 \- o  为了对堆栈中的数据进行操作,还必须有一个堆栈指针S,它是6502内部的一个8位寄存器,其作用是指示堆栈中允许进行存取操作的单元即栈顶地址的低位。由于6502规定堆栈设在1爷,所以栈顶高8位固定为$01,S只需8位栈顶低位就够了。另外,堆栈指针S在出栈操作时具有自动加1的功能,而在进栈操作时具有自动减1的功能,以保证S永远指向栈顶。2 u, d7 g; x# ?- b: X1 j* }
  不过,堆栈在使用时还有这么几个问题要加以注意:5 K, H( h2 E; f/ a- T9 |+ m6 B* `2 r
1.如果没有进栈的数据就执行出栈操作是不允许的,空栈不能取。/ u& B9 X% o( n4 ]
2.如果只进栈不出栈,会造成在堆栈中积压的数据过多,超过256个,则堆栈指针S的值会产生$00-1=$FF的情况,盖住以前进栈的资料。
  u* @) `' {& M5 P+ L                        --------by   sossb
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|国治模拟精品屋 ( 沪ICP备15012945号-1 )

GMT+8, 2026-1-15 05:59 , Processed in 1.069336 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表