程序集弹出空堆栈

标签 assembly x86 a86

我正在学习汇编,想知道当你弹出一个空堆栈或在它已经是 FFFE 时增加 SP(堆栈指针)时会发生什么:

seg1 segment 
       org 100h 
       pop ax
       mov ah,4ch 
       int 21h
seg1 ends

当我通过调试器运行程序时,我看到执行 pop 命令后 SP 将指向 SP = 0000。为什么SP指向0000?是不是因为内存中的最大SP是FFFF,所以就循环到第一个点? (我知道SP只会增加或减少2,因为push和pop总是2字节) 当命令执行时,程序会在 SP = 0000 处弹出任何内容吗?

我正在使用 86 宏汇编器 Oracle VM VirtualBox。 谢谢。

最佳答案

这种效果称为“环绕”。 FFFE 加 2 就是 10000,但是第一位被去掉了,所以结果是 0000。

这对于有符号操作来说非常有用:FFFE 相当于 -2。 -2 + 2 = 0。

是的,下一个 pop 将加载 SS:0000 处的值并递增 SP,而 push 也会导致环绕并在 SS 处存储值: FFFE。

关于程序集弹出空堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32943666/

相关文章:

c++ - 将内联汇编与序列化说明一起使用

c - 如何将一个 8 字节长整数的每个字节相加?

c - 为什么键盘中断在 QEMU 中起作用,但在真实硬件上不起作用?

algorithm - 使用增量和乘以 2 生成任意数字

c - 缓冲区溢出漏洞 - 为什么 shellcode 放在返回地址之前

memory - 创建指向特定位置的指针

c - 如何在 MASM 中使用 pop 和 ret

datetime - 程序集 A86 - 获取并显示时间

assembly - 在两个不同的行上打印一个字符串