+ 首页>>技能>>快速科普>>内容

技能[测试人也Code]从底层再次讨论“栈”345次围观

还记得笔者之前跟大家分享的“[测试人也Code]栈”吗?我们之前讨论了栈的三种含义,还记得吗?

  • 含义一:数据结构
  • 含义二:代码运行方式
  • 含义三:内存区域

当然,我们这其实讨论的是高级语言层面的含义,笔者之前看了本书,又遇到这个栈,因此,笔者想在这跟大家交流一下这个“栈”在底层的实现方式或者说含义。

当然,我们对栈的研究仅限于这个角度:栈是一种具有特殊的访问方式的存储空间。其实,它的特殊性就是笔者之前所谈的数据结构,而访问方式,其实就是之前谈的内存区域。所以,我们试着从底层(或者说汇编)角度解读一下这个所谓的内存区域是怎么样的。Come on!!

CPU提供的栈机制

现今的CPU中都有栈的设计,我们从古老的8086CPU讲起。8086CPU提供了相关的指令来以栈的方式访问内存空间,这意味着,在基于8086CPU编程时,可以将一段内存当作栈来试用。
8086CPU提供入栈和出栈指令,最基本的两个是PUSH和POP,比如,push ax表示将寄存器ax中的数据送入栈中,pop ax表示从栈顶取出数据送入ax,8086CPU的入栈和出栈都是以字为单位的。(读者无需深入了解ax、bx这些指令,可以简单的把他们认为是CPU中的一些器件,用来存储信息的就可以了,专业术语称作为“寄存器”)

在8086CPU中,有很多寄存器,其中有两个寄存器SS和SP是用来存储栈信息的,其中SS用来存储栈顶的段地址,SP用来存储栈的偏移地址(其实,这跟我们CPU寻址方式类似。什么?不知道CPU寻址方式?!!多补点基础知识吧!)。所以在任意时刻,SS:SP指向的是栈顶元素。在执行push和pop操作时,CPU会从SS和SP中得到栈顶的位置。

push进栈

我们假设将10000H~1000FH这段内存当作栈来使用,然后我们画一个图表示一下push指令的执行过程!
首先是第一个状态:
[测试人也Code]从底层再次讨论“栈”
接下来执行进栈操作:push ax
[测试人也Code]从底层再次讨论“栈”

[测试人也Code]从底层再次讨论“栈”
从图中我们可以看出,8086CPU中,入栈时,栈顶从高地址向低地址方向增长。

思考:如果上述的栈中,初始状态为空栈,则,SS=1000H,SP=??

答案:SP=0010H

栈空,SS:SP指向栈空间最高地址单元的下一个单元~~~

pop出栈

我们假设将10000H~1000FH这段内存当作栈来使用,然后我们画一个图表示一下pop指令的执行过程!
[测试人也Code]从底层再次讨论“栈”

[测试人也Code]从底层再次讨论“栈”

[测试人也Code]从底层再次讨论“栈”

注意:出栈后,SS:SP指向新的栈顶1000EH,pop操作前的栈顶元素,1000CH处的1122H依然存在,但是,它已不在栈中。当再次执行push等入栈指令后,SS:SP移至1000CH,并在里面写入新的数据,原先的数据将被覆盖!!!

OK,至此,简要介绍了下底层栈的实现方式,当然笔者所写的这些都还只是皮毛,欢迎大家指正!

+ 猜你喜欢...

===== 关于 DiggerPlus =====
DiggerPlus是国内新锐测试人垂直内容博客,专注于挖掘测试工具,普及测试技术,专注于测试人能力提升,博客上线后就受到广大测试人的热烈追捧;此外,DiggerPlus深度整合评测资源,揭秘科技数据和真相,让读者更懂科技,更好地把玩科技。 我们始终保持"独立,客观,严谨,优秀"的优良作风,努力为读者带来源源不断的优质内容。想访问更多酷毙的测试人网站?赶紧来DiggerPlus测试人网址导航看看吧!

===== DiggerPlus Team =====
DiggerPlus Team是DiggerPlus官方发起的团队,这是一群热爱科技,热爱测试,喜欢深度挖掘的热血测试人,他们是评测师,测试专家。 我们欢迎优秀的测试人加入DiggerPlus Team。 加入DiggerPlus,可以成为我们的认证Dper,认证Dper拥有DiggerPlus独一无二的专栏并得到个人展示。

===== DiggerPlus 官方读者群 =====
DiggerPlus官方读者群(一)

+ 关于本文作者

我也很想让世界变得更美好,可是上帝却不开放源代码。

的专栏 | 专栏作者 | 访问Kiven的主页

+ 已有12个评论

开源中国精彩推送

基于开源中国OpenAPI开发
  • Copyright © 2014 DiggerPlus. 94 queries in 1.586 seconds.
    使用合作网站账号快速登录,更多精彩等着您: 开源中国