注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

FY

Johnson 's Blog

 
 
 

日志

 
 

RET 指令  

2012-03-07 16:00:26|  分类: C Programming L |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一般在调用某个子程序之前,会像堆栈中压入一些参数供子程序使用。那么,子程序在返回时,如果要主动废除这些压入的参数的话,就可以通过RET XX来实现。XX--〉代表压入的参数的字节数目。

比如:有以下调用
push eax
push ebx
call func
ccc:
...


func:
....
...
ret 8--->意思是废除压入的eax,ebx两个参数(两个寄存器占用了8个字节).并返回ccc继续运行

Fei:外部函数call funnc,在func内部 最后有一个ret指令,这里ret8 此时esp里保存着下一条指令的地址,正常情况下是ret 不带参数的,
这种情况下是esp中的内容给eip,然后esp加4,此时回到了之前的函数,并且esp指向了 之前push ebx的地方。如果是ret 8意思是这里的esp瑞要加 上
再要加上8,这样一来,eax,ebx这两个栈空间一下子就相当于没了


################################################
ret 默认是返回一个地址,即 ret 4
当在程序进入前压入多个参数后就要弹出相应的地址个数
比如
push a
push b
push c
....
...
ret 12 (3*4一个地址占四个空间)
不带任何参数时,用于在子程序的结束位置,被调用的子程序必须有ret指令,
否则调用没有ret指令的子程序会导致自陷,子程序执行完之后处于失控状态。
带参数ret n 表示子程序返回主程序的同时,堆栈弹出n个字节(栈顶指针减n)
####################################

  评论这张
 
阅读(980)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018