社区
汇编语言
帖子详情
SS代表的是堆栈的栈底吗?
CExplorer
2007-05-31 01:46:17
看到一本书上说,SP总是指向堆栈的栈顶,并且可变化。
那么堆栈的栈底用什么来表示??是不是堆栈值(SP)?如果不是,又是什么?
另外:这本书上还有一句话:堆栈的深度由SP的初值决定。这句话听起来好象说堆栈的深度是固定的,是这样吗?我觉得堆栈的深度是随SP的值不断变化的,
...全文
2290
11
打赏
收藏
SS代表的是堆栈的栈底吗?
看到一本书上说,SP总是指向堆栈的栈顶,并且可变化。 那么堆栈的栈底用什么来表示??是不是堆栈值(SP)?如果不是,又是什么? 另外:这本书上还有一句话:堆栈的深度由SP的初值决定。这句话听起来好象说堆栈的深度是固定的,是这样吗?我觉得堆栈的深度是随SP的值不断变化的,
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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总是指向栈顶,不断变化,堆栈深度可以给定一个大小吧
精品资料(2021-2022年收藏)全国高等教育自学考试汇编语言程序设计试题..doc
当
堆栈
指针SP指向栈顶,且
SS
为
堆栈
段寄存器,
栈底
地址可以通过
SS
和SP的组合计算得出,即物理地址=16*
SS
+(SP-2),在给出的例子中是0808EHH。 4. **
堆栈
指令** - POP指令用于弹出
堆栈
顶部的数据到指定寄存器,问题4...
南开大学08-09第2学期计算机原理期末试卷B.doc
4. **
堆栈
指针SP**:
堆栈
指针SP存储的是栈顶的物理地址,而不是栈顶单元的内容或
栈底
单元的地址。 5. **存储器扩展**:4K×4的ROM和4K×2的RAM组合成128K×8的存储空间,需要考虑位宽匹配和容量匹配。128K×8表示...
微机原理课设计算器设计.pdf
在这个段中,定义了一个容量为200字节的
堆栈
,初始时
堆栈
顶指针指向
栈底
。 程序代码段(CODESEGMENT)包含程序的主要逻辑。程序开始时,通过A
SS
UME指令设置CS(代码段寄存器)、DS(数据段寄存器)和
SS
(
堆栈
段...
《微机原理及接口技术》 试卷7及答案
堆栈
指针SP总是指向
堆栈
的栈顶,而不是
栈底
。 5. **MOV指令格式** - **知识点解析**: 错误。指令`MOV [BP+10],BUF`是错误的,正确的格式应该是`MOV [BP+10],AL` 或 `MOV [BP+10],AX` 等,其中AL或AX是寄存器,...
第三章--
堆栈
段的工作方式
堆栈
段在实模式和保护模式下的工作方式相同,下面...
SS
定位到
堆栈
段的起始地址(基地址,低地址),
栈底
位于
堆栈
段的有效地址的最末端(高地址)。SP初始化为
堆栈
段的大小,
SS
:SP永远指向
堆栈
的栈顶。在初始化时,
SS
:SP
汇编语言
21,498
社区成员
41,617
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章