鱼C论坛

 找回密码
 立即注册
查看: 436|回复: 3

[已解决]栈问题

[复制链接]
发表于 2023-6-30 09:37:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
给定SS SP的时候 指针一开始不是在SP=SP+1的位置吗 那为什么3.11说栈空的时候要sp=sp+2 栈不是每时每刻都是空的吗 要不然为什么要pop?
最佳答案
2023-6-30 10:01:48


在汇编语言中,SS和SP是用来操作栈的寄存器。当执行指令PUSH或者POP时,栈指针SP会发生变化。

首先,让我们来解释一下PUSHPOP指令的原理:

  • PUSH指令:将数据压入栈中。它的操作是将数据存放在当前栈指针指向的内存单元,然后将 栈指针SP减小(SP=SP-1)。
  • POP指令:将数据从栈中弹出。它的操作是将栈指针SP增加(SP=SP+1),并将栈顶的数据取 出。


现在回答你的问题:

  • 当执行PUSH指令时,栈指针SP会减小,因为数据被存放在当前栈指针所指向的内存单元,所 以栈指针不会在PUSH指令后立即增加。也就是说,指针一开始并不是在SP=SP+1的位置。
  • 关于3.11中提到的栈空的情况,如果栈中没有数据可以弹出(即栈为空),在执行POP指令时,仍然会执行栈指针的增加操作(SP=SP+1)。这是因为栈指针在POP指令之前已经指向了一个无效的内存位置,所以需要将栈指针SP增加,使其指向一个有效的内存位置。


总结起来,栈在某些情况下可能为空,但仍然需要执行POP指令来处理栈指针的移动,以维护正 确的堆栈结构。这就是为什么在栈空的情况下要执行sp=sp+2的原因,其中2表示栈元素的大小(假设为两个字节)。

希望以上解答能够解决你的疑问!如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-30 09:45:15 | 显示全部楼层
Code?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-30 09:51:01 | 显示全部楼层

这不是理论吗。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-30 10:01:48 | 显示全部楼层    本楼为最佳答案   


在汇编语言中,SS和SP是用来操作栈的寄存器。当执行指令PUSH或者POP时,栈指针SP会发生变化。

首先,让我们来解释一下PUSHPOP指令的原理:

  • PUSH指令:将数据压入栈中。它的操作是将数据存放在当前栈指针指向的内存单元,然后将 栈指针SP减小(SP=SP-1)。
  • POP指令:将数据从栈中弹出。它的操作是将栈指针SP增加(SP=SP+1),并将栈顶的数据取 出。


现在回答你的问题:

  • 当执行PUSH指令时,栈指针SP会减小,因为数据被存放在当前栈指针所指向的内存单元,所 以栈指针不会在PUSH指令后立即增加。也就是说,指针一开始并不是在SP=SP+1的位置。
  • 关于3.11中提到的栈空的情况,如果栈中没有数据可以弹出(即栈为空),在执行POP指令时,仍然会执行栈指针的增加操作(SP=SP+1)。这是因为栈指针在POP指令之前已经指向了一个无效的内存位置,所以需要将栈指针SP增加,使其指向一个有效的内存位置。


总结起来,栈在某些情况下可能为空,但仍然需要执行POP指令来处理栈指针的移动,以维护正 确的堆栈结构。这就是为什么在栈空的情况下要执行sp=sp+2的原因,其中2表示栈元素的大小(假设为两个字节)。

希望以上解答能够解决你的疑问!如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 16:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表