前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用call和ret实现子程序

用call和ret实现子程序

作者头像
Masimaro
发布2019-02-25 17:20:08
8230
发布2019-02-25 17:20:08
举报

ret和call是另外两种转移指令,它们与jmp的主要区别是,它们还包含入栈和出栈的操作。具体的原理如下: ret操作相当于:pop ip(直接将栈顶元素赋值给ip寄存器)

call s的操作相当于:push ip jmp s(先将ip的值压栈,再跳转)

retf的操作相当于:pop ip pop cs

call dword ptr s相当于:push cs push ip 这两组指令为我们编写含子函数的程序提供了便利,一般的格式如下: main: ……… call s …….. a s: …….. call s1 ………. b ret s1: ………. call s2 ……… c ret s2: ……… d call s3 ret s3: …….. ret 分析以上的程序,假设call的下一条指令的偏移地址分别为:a、b、c、d 随着程序的执行,ip指向call指令,CPU将这条指令放入指令缓冲器,执行上一条指令,然后ip指向下一条指令,ip = a。执行call指令,根据call的原理先执行a入栈,此时栈中的情况如下

这里写图片描述
这里写图片描述

然后跳转到s,执行到call指令处时,ip = b,b首先入栈,然后跳转到s1

这里写图片描述
这里写图片描述

执行到s1处的call指令时,ip = c,c入栈,然后跳转到s2

这里写图片描述
这里写图片描述

执行到s2处的call指令时,ip = d,d入栈,然后跳转到s3

这里写图片描述
这里写图片描述

执行到s3处的ret指令时,栈顶元素出栈,ip = d,程序返回到s2中,到ret时,ip = c,程序返回到s1,再次执行ret,ip = b,程序返回到s,执行ret,ip = a,程序返回到main中,接下来正常执行main中的代码,知道整个程序结束。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-10-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档