首页
博客
专栏课程
下载
问答
社区
会员中心
论坛
代码
直播
Chrome 插件
能力认证
导航
全部
博文收录
Ada助手
问答
...
博文收录
Ada助手
问答
登录/注册
社区
汇编语言
帖子详情
SS代表的是堆栈的栈底吗?
CExplorer
2007-05-31 01:46:17
看到一本书上说,SP总是指向堆栈的栈顶,并且可变化。
那么堆栈的栈底用什么来表示??是不是堆栈值(SP)?如果不是,又是什么?
另外:这本书上还有一句话:堆栈的深度由SP的初值决定。这句话听起来好象说堆栈的深度是固定的,是这样吗?我觉得堆栈的深度是随SP的值不断变化的,
...全文
给本帖投票
2250
11
打赏
收藏
SS代表的是堆栈的栈底吗?
看到一本书上说,SP总是指向堆栈的栈顶,并且可变化。 那么堆栈的栈底用什么来表示??是不是堆栈值(SP)?如果不是,又是什么? 另外:这本书上还有一句话:堆栈的深度由SP的初值决定。这句话听起来好象说堆栈的深度是固定的,是这样吗?我觉得堆栈的深度是随SP的值不断变化的,
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
ntvdm cpu遇到无效的指令
>>
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
发表回复
按下Enter换行,Ctrl+Enter发表内容
编辑
预览
轻敲空格完成输入
显示为
卡片
标题
链接
打赏红包
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
精品资料(2021-2022年收藏)
南开大学08-09第2学期计算机原理期末试卷B.doc
南开大学计算机原理期末考试往年试卷 对于复习和预习,总结具有一定的参考意义 但不要迷信试卷,还是要好好复习
微机原理课设计算器设计.pdf
微机原理课设计算器设计.pdf
《微机原理及接口技术》 试卷7及答案
大学《微机原理及接口技术》 试卷7及答案 对8086知识点的巩固
第三章--
堆栈
段的工作方式
堆栈
段在实模式和保护模式下的工作方式相同,下面我们只介绍在实模式下的工作方式: 其中
SS
堆栈
段寄存器,用来存储
堆栈
段的初始地址;SP
堆栈
指针寄存器,用来存储
堆栈
段的栈顶偏移量。
堆栈
段初始化的工作如下:
SS
定位到
堆栈
段的起始地址(基地址,低地址),
栈底
位于
堆栈
段的有效地址的最末端(高地址)。SP初始化为
堆栈
段的大小,
SS
:SP永远指向
堆栈
的栈顶。在初始化时,
SS
:SP
汇编语言
21,497
社区成员
41,616
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
积分榜
荣誉榜
原力榜
学习榜
近7日
近30日
至今
排名
用户
积分
日立奔腾浪潮微软松下联想
1,035
赵4老师
635
zara
555
4
SilentHunter460
445
5
大半生还是很失败
345
6
Baiketan
145
7
CSDN-Ada助手
105
8
凉薄少年不良
90
9
蚂蚁摩斯隐私计算论坛
75
10
迷oO
70
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章
手机看
关注公众号
客服
返回
顶部