SS代表的是堆栈的栈底吗?

CExplorer 2007-05-31 01:46:17
看到一本书上说,SP总是指向堆栈的栈顶,并且可变化。

那么堆栈的栈底用什么来表示??是不是堆栈值(SP)?如果不是,又是什么?

另外:这本书上还有一句话:堆栈的深度由SP的初值决定。这句话听起来好象说堆栈的深度是固定的,是这样吗?我觉得堆栈的深度是随SP的值不断变化的,

...全文
2251 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mengshijie_1981 2007-06-04
  • 打赏
  • 举报
回复
在实模式下,SP的初始值就是堆栈的大小。SS是堆栈的段值(即SS*16是堆栈的基地址)。
lelevir 2007-06-04
  • 打赏
  • 举报
回复
那是不是说系统给ss分配多大空间就是堆栈的大小呢??
mengshijie_1981 2007-06-03
  • 打赏
  • 举报
回复
不好意思,笔误,纠正:
将:
SS:SP始终指向栈底(但只有堆栈为空时,SS:SP既是栈顶又是栈底)。
改为:
SS:SP始终指向栈顶(但只有堆栈为空时,SS:SP既是栈顶又是栈底)。

堆栈是一个固定大小(起码在初始化时,它是固定大小,而且在程序中,它的大小一般不会改变)的空间,如同大厦,显然大厦的顶部是固定不变的(n层),相当于栈底,底座也是固定的(0层)只有电梯是可以移动的,这个电梯不正像堆栈指针SP吗?堆栈初始化SP被定义成堆栈深度,即大厦高度,所以SP用n层来初始化。
CExplorer 2007-06-02
  • 打赏
  • 举报
回复
明白了,这么说,一个堆栈的大小,一旦确定了以后,是不会变化的。能变化的只是使用部分的大小。

看书上说的SP指向栈顶,而SP又能变化,我还以为堆栈的大小可变呢。现在清楚了。

不过楼上有一句我还是不理解,为什么说“SS:SP始终指向栈底”?

我觉得SS:SP应指向栈顶才对,(这里所说的栈顶是指堆栈已使用部分的顶部)。

另外:我觉得用“栈顶”来称呼堆栈中已使用部分的顶部是错误的,应当纠正。也许这是一个约定俗成的,也许是大家认同的惯例,但这实际上是一个语言使用的错误。这种错误会给初学者带来非常大的困惑和麻烦,是不规范的。
likexin 2007-06-02
  • 打赏
  • 举报
回复
SS是段直,楼主误解了,SS可以认为是整个栈的范围,应该好好看一下分段机制
hkbyest 2007-06-02
  • 打赏
  • 举报
回复
补充一下,mengshijie_1981() 说得其实已经很形象了,至于觉得有所歧义的桶盖已经由SS决定了,所以只能用栈顶来形容sp。(栈底是初始化时确定的)
hkbyest 2007-06-02
  • 打赏
  • 举报
回复
SS指(stack segment 堆栈段),其为sp提供段地址。ss:sp指向一段用户自定义的堆栈空间。

初始化堆栈时sp指向栈底处下一字节的位置(现在栈里面空的,所以也可以说指向栈顶)。

例如:
stack segment
dw 0,0
stack ends

code segment
start:
mov ax,stack
mov ss,ax
mov sp,?

这里sp填的是05h,因为前面用了0-4字节。

最后想说一下,SS:SP始终指向的是栈顶!使用栈顶这个名词很贴切,毕竟你把数据压栈了,sp指向的当然是放置数据的内存单元顶部了(堆栈的内存单元是从上往下生长的,这时低字节在上面),如果这时sp指向的是栈底,那么你的栈还是空的,那就没有意义了。
mengshijie_1981 2007-06-01
  • 打赏
  • 举报
回复
在实模式下,SS*4是堆栈段的基地址,程序初始化时,堆栈为空栈(SP被初始化为堆栈的大小,即堆栈的深度),此时栈底等于栈顶。SS:SP始终指向栈底(但只有堆栈为空时,SS:SP既是栈顶又是栈底)。随着压栈操作,SP逐渐减小,SP越来越趋于0。当SP等于0时,SS:SP实际上就是SS:00。
假设SS=1000H,SP=100H(堆栈大小),

基地址:SS*4=10000H(堆栈段的基地址)
栈顶: SS*4+SP=10000H+100H=10100H
栈底: SS*4+堆栈段大小=10000H+100H=10100H

堆栈大小 = 栈底 - 基地址

其实“栈顶”这个名字并不确切。因为如果把堆栈比作水桶的话,栈底相当于桶底,堆栈大小(堆栈深度)相当于水桶的高度(或深度),因此栈顶这个概念应该对应水桶的桶口或桶盖,但是汇编语言中把水桶的水面命名为栈顶,因此基地址就相当于桶口或者桶盖。

桶盖-基地址(即SS*4)
水面-栈顶
桶深-堆栈深度(堆栈大小)
桶底-栈底

程序使用堆栈就如同我们使用水桶盛大饼,先进后出,唯一不同的是,栈顶不等同于桶盖,而是等同于桶中最上面的那张大饼。


jrjj 2007-05-31
  • 打赏
  • 举报
回复
SS=堆栈段,SP=堆栈偏移量,栈值=你放入堆栈区域的值

ss:sp只是寻址内存,比如堆栈大小是1KB,初始SP就是相对于SS的400H,SS看你程序载入内存而定,栈值你自己给定压入的值,A也好,B也好
CExplorer 2007-05-31
  • 打赏
  • 举报
回复
感谢解答

照你所说,初始时栈顶和栈底是同一个值,那这这时堆栈在内存中只是一条线,或者说只是一个点,没有空间。那么堆栈的值也必定和他们相等啦?即:SP=SS=栈值?
这样当堆栈变化时,SP会发生变化,而栈底不动,也就是SP变化,而SS=栈值=初始值??
jrjj 2007-05-31
  • 打赏
  • 举报
回复
初始栈顶和栈底应该是同一个值,SP总是指向栈顶,不断变化,堆栈深度可以给定一个大小吧

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧