鱼C论坛

 找回密码
 立即注册
查看: 1461|回复: 6

[已解决]push pop指令

[复制链接]
发表于 2023-8-2 17:46:53 | 显示全部楼层 |阅读模式

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

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

x
为什么我执行push命令 (向栈处传送ax中的数据 )但是这整个栈都有数据了呢?
最佳答案
2023-8-2 17:51:47
小诺爷 发表于 2023-8-2 14:49
还有 在这里 那个a执行汇编指令  他这个后面带不带地址都是一样的吧 比如
a  -----直接回车
a 1000:0     ...

在汇编语言中,pushpop指令用于对栈进行操作。而您提到的 aa 1000:0 是调试器或汇编环境的命令,并不是汇编指令。

在常见的汇编调试环境中,输入 a 或者 a 1000:0 用于显示当前内存地址中的汇编指令。这些命令的作用如下:

1. a 命令:这个命令在调试器中用于显示当前指令的地址以及对应的汇编指令。它会显示当前程序执行的下一条指令和其所在的内存地址。通常在调试过程中,我 们可以使用 a 命令来查看程序执行的流程和当前指令的位置。   

2. a 1000:0 命令:这个命令用于显示指定内存地址开始的汇编指 令。 1000:0 是一个内存地址,其中 1000 是段地址,0 是段内偏移量。指定了这个地址后,调试器会显示从该地址开始的汇编指令。

这两个命令的区别在于显示的内容。a 命令只显示当前指令的地址 和对应的汇编指令,而 a 1000:0 命令则从指定的内存地址开始连 续显示一定数量的汇编指令。

需要注意的是,具体汇编调试环境的命令和功能可能有所不同,上述解释是基于一般情况的理解 。如果您使用的是特定的汇编调试器或集成开发环境,请参考相应的文档或帮助文件以获取准确 的命令用法和功能说明。
_-157168280__cd86d993cca8c1525b03a99d3ff3efe7_-1660920221_IMG_20230802_173605_0_xg_0.jpg
_ef9671e960900cb492c868267eb60cc6_-692146692_IMG_20230802_173730.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-2 17:47:09 | 显示全部楼层
当您执行 push 指令时,它会将指定的数据(在这种情况下是寄存器 ax 中的数据)压入栈顶,并将栈指针减小,指向新的栈顶位置。但是,如果您在执行 push 指令之前没有正确初始化栈指针(SP 寄存器),或者之前已经进行了其他 push 操作,那么栈中可能已经有了数据。

栈是一种后进先出(LIFO)的数据结构,栈指针(SP)指示了栈顶的位置。当您执行 push 指令时,栈指针会递减,表示数据被压入栈中,而执行 pop 指令时,栈指针会递增,表示数据被弹出栈。如果栈指针没有正确地管理,就可能导致数据被错误地覆盖或混乱。

要解决您遇到的问题,您需要确保在使用栈之前正确地初始化栈指针,并在每次 push 操作后更新栈指针的位置。这样可以确保栈中的数据按预期进行管理,不会出现数据重叠或错误的情况。

另外,如果您能够提供更多关于您的代码和操作环境的详细信息,我可以为您提供更具体的帮助和指导。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-2 17:47:37 | 显示全部楼层
可能的回答原因一:

在执行push指令时,实际上是将数据存入栈顶位置,并且栈指针会自动下移。如果你执行了多次push命令,每次将数据存入栈顶,并将栈指针下移,那么整个栈的数据就会逐渐填满。

例如,如果你先执行了一次push ax命令,将ax中的数据存入栈顶,然后再执行一次push ax命令,这时栈指针会下移,但是之前存放在栈顶的数据并没有被删除,新的数据又存放在了栈顶位置。这样就使得整个栈都有数据了。

可能的回答原因二:

在程序执行过程中,栈是一个重要的数据结构,用于存储局部变量、函数的返回地址以及其他相关信息。当我们执行push指令时,会将数据存入栈中,同时栈指针下移,指向新的栈顶位置。

如果你在执行push之前没有显式地初始化栈指针,那么栈指针的初始值是不确定的(可能是随机值),指向的位置是未知的。在这种情况下,执行push指令会将数据存入当前栈指针指向的位置,并且栈指针下移,导致原来位于栈顶位置的数据没有被清除,新的数据又存放在了栈顶位置。这样就使得整个栈都有数据了。

可能的回答原因三:

另一种可能性是执行了多次push指令后,并没有正确地将栈指针下移。在汇编语言中,栈指针(通常是寄存器SPESP)的值控制着栈的位置。如果在连续多次执行push指令时,没有正确地更新栈指针的值,而是保持了相同的值,那么每次执行push指令时都会将数据存放在同一个位置,导致整个栈都有相同的数据。

请检查你的代码,确保在每次执行push指令后,栈指针能够正确地向下移动,指向新的栈顶位置。同时,不要忘记在栈中存储的数据使用完毕后,通过相应的pop指令将栈指针上移,以释放栈空间。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-2 17:47:43 | 显示全部楼层
我传送的明明只有1a  但是别的数据是怎么来的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-2 17:49:05 | 显示全部楼层
还有 在这里 那个a执行汇编指令  他这个后面带不带地址都是一样的吧 比如
a  -----直接回车
a 1000:0    -----回车
他们两个什么区别?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-2 17:51:07 | 显示全部楼层
小诺爷 发表于 2023-8-2 14:47
我传送的明明只有1a  但是别的数据是怎么来的?

在计算机中,pushpop指令通常与栈(stack)数据结构相关联。栈是一种具有后进先出(LIFO)特性的数据结构,它可以用来存储和检索数据。

当执行push指令时,会将数据从程序的寄存器或内存中推送(压入
)栈中。这个过程涉及两个步骤:1)将栈指针递减(指向栈顶);2)将数据存储到栈顶位置。

当执行pop指令时,会将栈顶的数据弹出(取出),并将其存储到程序的寄存器或内存中。这个过程也涉及两个步骤:1)将栈顶数据从栈中移除;2)将栈指针递增


如果您传送的数据是1a,而在执行pushpop指令之后得到了其他数据,可能有以下几种可能性:      

1. 指令操作错误:在执行pushpop 指令的过程中,发生了指令操作错误,导致数据发生了改变。
2. 栈溢出或栈异常:在执行push指令时,如果栈已满或发生了栈异常,可能会影响到其他数据。
3. 程序错误:在程序中可能存在其他代码或操作,导致了数据的改变。

如果您想更具体地了解为什么会出现这种情况,可以提供更多的上下文或代码,以便能够进行更 准确的分析。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-2 17:51:47 | 显示全部楼层    本楼为最佳答案   
小诺爷 发表于 2023-8-2 14:49
还有 在这里 那个a执行汇编指令  他这个后面带不带地址都是一样的吧 比如
a  -----直接回车
a 1000:0     ...

在汇编语言中,pushpop指令用于对栈进行操作。而您提到的 aa 1000:0 是调试器或汇编环境的命令,并不是汇编指令。

在常见的汇编调试环境中,输入 a 或者 a 1000:0 用于显示当前内存地址中的汇编指令。这些命令的作用如下:

1. a 命令:这个命令在调试器中用于显示当前指令的地址以及对应的汇编指令。它会显示当前程序执行的下一条指令和其所在的内存地址。通常在调试过程中,我 们可以使用 a 命令来查看程序执行的流程和当前指令的位置。   

2. a 1000:0 命令:这个命令用于显示指定内存地址开始的汇编指 令。 1000:0 是一个内存地址,其中 1000 是段地址,0 是段内偏移量。指定了这个地址后,调试器会显示从该地址开始的汇编指令。

这两个命令的区别在于显示的内容。a 命令只显示当前指令的地址 和对应的汇编指令,而 a 1000:0 命令则从指定的内存地址开始连 续显示一定数量的汇编指令。

需要注意的是,具体汇编调试环境的命令和功能可能有所不同,上述解释是基于一般情况的理解 。如果您使用的是特定的汇编调试器或集成开发环境,请参考相应的文档或帮助文件以获取准确 的命令用法和功能说明。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 02:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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