8086微处理器的堆栈溢出

ari*_*rif 3 stack-overflow assembly callstack microprocessors x86-16

当堆栈已满并且即使我向其中推入某些东西时,8086微处理器的行为如何?

sup*_*cat 6

在8086上,PUSH指令或隐式堆栈压入将SP寄存器减2,并将适当的数量存储在SS:SP(即16 * SS + SP)上。如果SP寄存器为$ 0000,则数据将到达SS:$ FFFE。如果SP寄存器为$ 0001,则数据的MSB将到达SS:$ 0000,而LSB将到达SS:$ FFFF。处理器不会特别注意堆栈环绕。尽管堆栈环绕通常是一件坏事,但在8086上有些情况下可以忽略不影响任何事情。例如,如果SS指向不需要其他任何东西的64K RAM,并且某个永不退出的程序有时通过简单地调用“ main()”而不重新设置堆栈来重新启动自身,则该堆栈可以绕回而无需影响程序操作

请注意,在80386和更高版本的处理器上,堆栈下溢行为已更改。PUSH,CALL等使用32位(或64位)地址计算,而不是16位,并且将它们包装为$ FFFFFFFF(或$ FFFFFFFFFFFFFFFFFF)而不是$ FFFF。


Chr*_*isW 5

8086没有“保护模式”,因此没有“堆栈底部的保护页”,因此没有明确定义的异常。相反,您的压入将覆盖堆栈底部以下的任何代码或数据,如果执行了该代码或使用了该数据,最终(但不是立即)将导致“未定义的行为”。