新手请教,汇编中只出栈,没有进栈,会怎样
刚开始学汇编,写了段小程序,在pop命令之前没有push命令,就直接出栈,不知道是不是这个原因,发现把pop指令执行后,,cs和ip就跳到别的地方了,不会执行下一条指令,...
刚开始学汇编,写了段小程序,在pop命令之前没有push命令,就直接出栈,不知道是不是这个原因,发现把pop指令执行后,,cs和ip就跳到别的地方了,不会执行下一条指令,是什么原因,求教了,十分感谢
展开
5个回答
展开全部
pop指令本身并不会造成CS和IP跳到别的地方,它只是单纯地起到将SS:SP所指的内存内容送入你指定的目的地址并同时修改SP的值的作用。
你的程序会跳到别处,是因为你在其它地方使用堆栈的时候,比如子程序中最后的RET,由于你堆栈数据关系错位,导致返回时没有能获得当初你CALL时压入堆栈的正确的返回地址,而将别的错误的数当成了返回地址的原因。
一般说来,使用堆栈时,必须由编程者自己考虑好堆栈里的数据是如何使用的,要通过程序指令的运用,保证你弹出的是你需要的那个数,而不是别的数。这就要求在使用堆栈时应当PUSH进一个就对应POP出栈一个(我称它为平衡操作),且必须是先进的数后出。
建议你在分析程序运行时自己画一个堆栈中数据内容的示意图进行分析,搞清楚指令执行过程中每个时刻当前的栈顶在哪里,栈里有哪些数据,它们如何变化,这样就不容易乱了。
你的程序会跳到别处,是因为你在其它地方使用堆栈的时候,比如子程序中最后的RET,由于你堆栈数据关系错位,导致返回时没有能获得当初你CALL时压入堆栈的正确的返回地址,而将别的错误的数当成了返回地址的原因。
一般说来,使用堆栈时,必须由编程者自己考虑好堆栈里的数据是如何使用的,要通过程序指令的运用,保证你弹出的是你需要的那个数,而不是别的数。这就要求在使用堆栈时应当PUSH进一个就对应POP出栈一个(我称它为平衡操作),且必须是先进的数后出。
建议你在分析程序运行时自己画一个堆栈中数据内容的示意图进行分析,搞清楚指令执行过程中每个时刻当前的栈顶在哪里,栈里有哪些数据,它们如何变化,这样就不容易乱了。
意法半导体(中国)投资有限公司
2023-06-12 广告
2023-06-12 广告
单片机汇编程序是用汇编语言编写的程序,用于控制单片机的操作。汇编语言是一种比较接近计算机硬件语言的低级语言,相对于高级语言来说更容易理解和实现。下面是单片机汇编程序的基本步骤:1. 将代码和数据汇编到规定的段中。2. 在存储器中用未初始化的...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
展开全部
堆栈段的压栈和出栈只受SS:SP的影响。而执行操作是由代码段来执行命令的,代码段你忘了吗? CS:IP 所以你看到的cs和ip在改变实际是在执行代码命令。注意压栈和出栈配合使用。一压一出,先进后出。
加个联系方式,一起学。我也才学习。刚学到7章节。
加个联系方式,一起学。我也才学习。刚学到7章节。
追问
qq 1908945706
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
计算机只认识数据的
你如果程序中不push,就把程序自己的代码数据就pop出去了
那么后面计算机碰到需要计算cs和ip的情况,计算的就是剩下的另外的数据了
计算的数据都不对了,当然会跳到别的地方去
你如果程序中不push,就把程序自己的代码数据就pop出去了
那么后面计算机碰到需要计算cs和ip的情况,计算的就是剩下的另外的数据了
计算的数据都不对了,当然会跳到别的地方去
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果调用了 中断 或者 子函数 堆栈是用来保护现场的 但是你pop 把现场破坏了 所以会到处乱跳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你没有贴出具体代码来,也不好分析啊。问这种问题最好有代码 , 不然神仙也不知道喽。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询