当前位置: 首页 > news >正文

用call和ret实现子程序

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中的代码,知道整个程序结束。

转载于:https://www.cnblogs.com/lanuage/p/7725722.html

相关文章:

  • 求二叉树高度
  • spring整合javaweb(第二版)
  • 转:依赖注入那些事儿
  • 只操作git(cmd)就可以使用git将项目上传到github
  • 转载:javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册...
  • 【前端】自适应布局方法总结
  • UML类图详解_关联关系_多对多
  • MyBatis-day2
  • 入坑tensorflow
  • 获取class文件对象的三种方法
  • ALPHA-3
  • 关于Vue.js
  • mybatis(错误一) 项目启动时报“Result Maps collection already contains value forxxx”的解决方案...
  • Oracle分区表常见操作
  • shell设置时间递减脚本
  • php的引用
  • 10个最佳ES6特性 ES7与ES8的特性
  • Docker容器管理
  • export和import的用法总结
  • Java程序员幽默爆笑锦集
  • leetcode-27. Remove Element
  • Linux CTF 逆向入门
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Spring核心 Bean的高级装配
  • 阿里云前端周刊 - 第 26 期
  • 警报:线上事故之CountDownLatch的威力
  • 理解在java “”i=i++;”所发生的事情
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 使用agvtool更改app version/build
  • 数据结构java版之冒泡排序及优化
  • 我建了一个叫Hello World的项目
  • 我与Jetbrains的这些年
  • 学习使用ExpressJS 4.0中的新Router
  • Java数据解析之JSON
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • #include
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (差分)胡桃爱原石
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • .gitignore文件设置了忽略但不生效
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .net开发引用程序集提示没有强名称的解决办法
  • .net快速开发框架源码分享
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • /etc/sudoer文件配置简析
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @TableId注解详细介绍 mybaits 实体类主键注解