3

当堆栈已满时,8086 微处理器的行为会是什么,即使我将一些东西压入其中?

4

3 回答 3

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(或 $FFFFFFFFFFFFFFFF)而不是 $FFFF。

于 2011-01-28T16:31:52.597 回答
5

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

于 2010-08-14T22:52:17.527 回答
3

没有尽头。我的意思是这些处理器中的堆栈具有相反的顺序(从右到左)。所以它会一直持续到一个 rom 块或内存结束。这会导致处理器出现异常,可能会自行软重置。

于 2010-08-14T22:25:04.780 回答