鱼C论坛

 找回密码
 立即注册
查看: 5475|回复: 10

[已解决]栈 SS:SP越界问题

[复制链接]
发表于 2021-2-23 20:59:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

小甲鱼说 计算机只知道栈顶 不知道上限和下限

但SS    不就是上限嘛
计算机难道不知道嘛
最佳答案
2021-2-23 21:18:13
本帖最后由 jackz007 于 2021-2-23 21:24 编辑

       SS 只是堆栈段寄存器,通过 SS 可以寻址 64 K(SS:0000~SS:FFFF)的内存空间,但是,这并不意味着 SS 段整个 64 KB 存储空间都属于堆栈段。这要看在编写代码的时候,预留的堆栈段空间具体有多大。
       程序运行时,计算机并不知道内存中堆栈区的分布状况,它只管按需要使用,而不会关心是否会因此而超出堆栈段的有效空间。
       保护各个段的数据不被意外侵害,永远是程序员,而不是计算机的义务。所以,在编写汇编语言代码的时候,要合理布局数据段、堆栈段和代码段,特别是必须为堆栈段预留出足够大的内存,以确保在任何情况下,都不会因为堆栈段太小而越界侵害到其它数据或代码段的内存区域。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-23 21:18:13 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-2-23 21:24 编辑

       SS 只是堆栈段寄存器,通过 SS 可以寻址 64 K(SS:0000~SS:FFFF)的内存空间,但是,这并不意味着 SS 段整个 64 KB 存储空间都属于堆栈段。这要看在编写代码的时候,预留的堆栈段空间具体有多大。
       程序运行时,计算机并不知道内存中堆栈区的分布状况,它只管按需要使用,而不会关心是否会因此而超出堆栈段的有效空间。
       保护各个段的数据不被意外侵害,永远是程序员,而不是计算机的义务。所以,在编写汇编语言代码的时候,要合理布局数据段、堆栈段和代码段,特别是必须为堆栈段预留出足够大的内存,以确保在任何情况下,都不会因为堆栈段太小而越界侵害到其它数据或代码段的内存区域。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-24 13:57:11 | 显示全部楼层
举一个例子吧。
ss:sp是073f;00fd,具体地址是74ED(ss*16+sp)(因为是16进制,所以ss*16其实就是进一位)
如果我们只知道ss是073f0的话,不知道sp的值,我们只能认为sp是0000-ffff中任意一个数字。也就意味着,栈底是73f0-1 073E中的一个。
所以,栈指针,完全没有指明栈顶,只知道栈底。

-
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-27 22:54:18 | 显示全部楼层
635924705 发表于 2021-2-24 13:57
举一个例子吧。
ss:sp是073f;00fd,具体地址是74ED(ss*16+sp)(因为是16进制,所以ss*16其实就是进一 ...

啊? 那sp为0时不就是上限嘛。
ss:sp   是 073f:0时   物理地址 073f0不就是上限嘛(底地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-27 22:56:25 | 显示全部楼层
635924705 发表于 2021-2-24 13:57
举一个例子吧。
ss:sp是073f;00fd,具体地址是74ED(ss*16+sp)(因为是16进制,所以ss*16其实就是进一 ...

你说的底是不是高地址呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-27 22:57:02 | 显示全部楼层
jackz007 发表于 2021-2-23 21:18
SS 只是堆栈段寄存器,通过 SS 可以寻址 64 K(SS:0000~SS:FFFF)的内存空间,但是,这并不意味着 S ...

那知道底地址的上限嘛      sp为0时
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-27 23:28:34 | 显示全部楼层
本帖最后由 jackz007 于 2021-2-27 23:37 编辑

       前面说过,计算机只管使用堆栈,根本不会去顾及 sp 的值具体是多少。例如,当 sp 为 0 时,执行
sub sp , 2
       之后,sp = 0FFFEH,就是说,任何时候无论 sp 的值是多少,堆栈操作都会成功,只不过堆栈越界使用内存空间是十分有害的。我们写代码的时候,必须要避免发生这样的事情。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-28 13:49:20 | 显示全部楼层
万千只cnm 发表于 2021-2-27 22:54
啊? 那sp为0时不就是上限嘛。
ss:sp   是 073f:0时   物理地址 073f0不就是上限嘛(底地址

你要是一定把栈底理解成上限也行,那对于机器,那就是有上限,下限最大是sp为ffff。但是程序员并不这么想,程序员只用sp为0到sp为ffff中的很小一段,其他的放代码,放数据都行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-1 20:40:49 | 显示全部楼层
635924705 发表于 2021-2-28 13:49
你要是一定把栈底理解成上限也行,那对于机器,那就是有上限,下限最大是sp为ffff。但是程序员并不这么想 ...

oo
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-1 20:41:28 | 显示全部楼层
jackz007 发表于 2021-2-27 23:28
前面说过,计算机只管使用堆栈,根本不会去顾及 sp 的值具体是多少。例如,当 sp 为 0 时,执行

...

哦哦好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-2 18:07:34 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 15:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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