万千只cnm 发表于 2021-2-23 20:59:31

栈 SS:SP越界问题


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

但SS    不就是上限嘛{:5_104:}
计算机难道不知道嘛

jackz007 发表于 2021-2-23 21:18:13

本帖最后由 jackz007 于 2021-2-23 21:24 编辑

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

635924705 发表于 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中的一个。
所以,栈指针,完全没有指明栈顶,只知道栈底。

-

万千只cnm 发表于 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不就是上限嘛(底地址

万千只cnm 发表于 2021-2-27 22:56:25

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

你说的底是不是高地址呀

万千只cnm 发表于 2021-2-27 22:57:02

jackz007 发表于 2021-2-23 21:18
SS 只是堆栈段寄存器,通过 SS 可以寻址 64 K(SS:0000~SS:FFFF)的内存空间,但是,这并不意味着 S ...

那知道底地址的上限嘛      sp为0时

jackz007 发表于 2021-2-27 23:28:34

本帖最后由 jackz007 于 2021-2-27 23:37 编辑

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


635924705 发表于 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中的很小一段,其他的放代码,放数据都行。

万千只cnm 发表于 2021-3-1 20:40:49

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

oo

万千只cnm 发表于 2021-3-1 20:41:28

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

...

哦哦好{:5_104:}

何处追寻 发表于 2021-3-2 18:07:34

{:10_256:}
页: [1]
查看完整版本: 栈 SS:SP越界问题