汇编的call与ret的问题
假如pushadmoveax,xxxxcalleaxpopadret为什么其他栈操作就不影响返回呢,call是将csip压栈,而ret又从栈里取csip返回...
假如
pushad
mov eax,xxxx
call eax
popad
ret
为什么其他栈操作就不影响返回呢
,call 是将cs ip压栈 ,而ret又从栈里取cs ip返回 展开
pushad
mov eax,xxxx
call eax
popad
ret
为什么其他栈操作就不影响返回呢
,call 是将cs ip压栈 ,而ret又从栈里取cs ip返回 展开
展开全部
你要知道的是 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
应该去掉
你的假如代码通透分析如下
pushad 8个基本寄存器压栈保存
mov eax,xxxx 想必你的意思是偏移地址传送给eax,但这样是有问题的
call eax 我们就 当这样是没问题,只是假设。。call调用前把下一行的
代码的偏移地址压栈(这样返回后就可以继续执行call的下一句
代码了)
popad 8个基本寄存器出栈
ret 弹出偏移地址(call后面一下代码的地址)
为什么其他栈操作就不影响返回呢???
首先 pushad压栈8个32位基本寄存器,然后call压进自身下一行代码的偏移地址
然后 call返回的时候它调用的子例程里面也有个ret弹出call压进栈的偏移地址(估计你是不理解 这里)
你这段代码如果是子例程的,那后面可以加ret,如果是主程序代码段,那后面的ret
应该去掉
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询