汇编的call与ret的问题

假如pushadmoveax,xxxxcalleaxpopadret为什么其他栈操作就不影响返回呢,call是将csip压栈,而ret又从栈里取csip返回... 假如
pushad
mov eax,xxxx
call eax
popad
ret
为什么其他栈操作就不影响返回呢
,call 是将cs ip压栈 ,而ret又从栈里取cs ip返回
展开
 我来答
百度网友44d8da7
2012-08-21 · TA获得超过151个赞
知道答主
回答量:198
采纳率:0%
帮助的人:80.7万
展开全部
你要知道的是 call 只是将偏移地址压栈(而不是CS ,IP)
你的假如代码通透分析如下
pushad 8个基本寄存器压栈保存

mov eax,xxxx 想必你的意思是偏移地址传送给eax,但这样是有问题的

call eax 我们就 当这样是没问题,只是假设。。call调用前把下一行的
代码的偏移地址压栈(这样返回后就可以继续执行call的下一句
代码了)

popad 8个基本寄存器出栈

ret 弹出偏移地址(call后面一下代码的地址)

为什么其他栈操作就不影响返回呢???

首先 pushad压栈8个32位基本寄存器,然后call压进自身下一行代码的偏移地址
然后 call返回的时候它调用的子例程里面也有个ret弹出call压进栈的偏移地址(估计你是不理解 这里)
你这段代码如果是子例程的,那后面可以加ret,如果是主程序代码段,那后面的ret
应该去掉
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式