assembly - 8086微处理器的堆栈溢出

标签 assembly stack-overflow x86-16 callstack microprocessors

当堆栈已满并且我向其中插入一些东西时,8086 微处理器会发生什么行为?

最佳答案

在 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。

关于assembly - 8086微处理器的堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3485349/

相关文章:

delphi - 为什么某些汇编指令没有记录在案

gcc - "gcc -x c"和 "gcc -x c++"汇编输出的区别

在没有原型(prototype)的情况下将 C 地址作为函数调用

C代码调用程序集: infinite loop

asp.net-mvc - 我真的需要在关闭应用程序时处理 IUnityContainer

linux - 设法泄漏将函数地址放入libc中,但无法获取其他函数的地址

assembly - YASM [symbol + $$]有效地址在平面二进制格式中太复杂

c - 学习汇编语言如何帮助我调试 C 程序?

android - 从 onDraw() 调用 getDrawingCache() 时发生 StackOverflowError

algorithm - 汇编程序通过问题