栈 SS:SP越界问题
小甲鱼说 计算机只知道栈顶 不知道上限和下限
但SS 不就是上限嘛{:5_104:}
计算机难道不知道嘛 本帖最后由 jackz007 于 2021-2-23 21:24 编辑
SS 只是堆栈段寄存器,通过 SS 可以寻址 64 K(SS:0000~SS:FFFF)的内存空间,但是,这并不意味着 SS 段整个 64 KB 存储空间都属于堆栈段。这要看在编写代码的时候,预留的堆栈段空间具体有多大。
程序运行时,计算机并不知道内存中堆栈区的分布状况,它只管按需要使用,而不会关心是否会因此而超出堆栈段的有效空间。
保护各个段的数据不被意外侵害,永远是程序员,而不是计算机的义务。所以,在编写汇编语言代码的时候,要合理布局数据段、堆栈段和代码段,特别是必须为堆栈段预留出足够大的内存,以确保在任何情况下,都不会因为堆栈段太小而越界侵害到其它数据或代码段的内存区域。 举一个例子吧。
ss:sp是073f;00fd,具体地址是74ED(ss*16+sp)(因为是16进制,所以ss*16其实就是进一位)
如果我们只知道ss是073f0的话,不知道sp的值,我们只能认为sp是0000-ffff中任意一个数字。也就意味着,栈底是73f0-1 073E中的一个。
所以,栈指针,完全没有指明栈顶,只知道栈底。
- 635924705 发表于 2021-2-24 13:57
举一个例子吧。
ss:sp是073f;00fd,具体地址是74ED(ss*16+sp)(因为是16进制,所以ss*16其实就是进一 ...
啊? 那sp为0时不就是上限嘛。
ss:sp 是 073f:0时 物理地址 073f0不就是上限嘛(底地址 635924705 发表于 2021-2-24 13:57
举一个例子吧。
ss:sp是073f;00fd,具体地址是74ED(ss*16+sp)(因为是16进制,所以ss*16其实就是进一 ...
你说的底是不是高地址呀 jackz007 发表于 2021-2-23 21:18
SS 只是堆栈段寄存器,通过 SS 可以寻址 64 K(SS:0000~SS:FFFF)的内存空间,但是,这并不意味着 S ...
那知道底地址的上限嘛 sp为0时 本帖最后由 jackz007 于 2021-2-27 23:37 编辑
前面说过,计算机只管使用堆栈,根本不会去顾及 sp 的值具体是多少。例如,当 sp 为 0 时,执行
sub sp , 2
之后,sp = 0FFFEH,就是说,任何时候无论 sp 的值是多少,堆栈操作都会成功,只不过堆栈越界使用内存空间是十分有害的。我们写代码的时候,必须要避免发生这样的事情。
万千只cnm 发表于 2021-2-27 22:54
啊? 那sp为0时不就是上限嘛。
ss:sp 是 073f:0时 物理地址 073f0不就是上限嘛(底地址
你要是一定把栈底理解成上限也行,那对于机器,那就是有上限,下限最大是sp为ffff。但是程序员并不这么想,程序员只用sp为0到sp为ffff中的很小一段,其他的放代码,放数据都行。 635924705 发表于 2021-2-28 13:49
你要是一定把栈底理解成上限也行,那对于机器,那就是有上限,下限最大是sp为ffff。但是程序员并不这么想 ...
oo jackz007 发表于 2021-2-27 23:28
前面说过,计算机只管使用堆栈,根本不会去顾及 sp 的值具体是多少。例如,当 sp 为 0 时,执行
...
哦哦好{:5_104:} {:10_256:}
页:
[1]