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

8086汇编之 CALL 和 RET指令

Ret 和 call 也是转移指令,可是他们跟jmp不同的是,这两个转移指令都跟栈有关系。

<1> ret

用栈中的数据改动IP的地址,从而实现近转移

( ip ) = ( (ss)*16+ sp )

( sp ) =( sp ) + 2

相当于pop ip

<2>retf

用栈中的数据来改动CS以及IP的值,实现段间转移

( ip ) = ( (ss)*16+ sp )

( sp ) =( sp ) + 2

( cs ) = ( (ss)*16+ sp )

( sp ) =( sp ) + 2

相当于

Pop ip

Pop cs

<3> call xxx(行号)

先把当前IP压栈,然后跳转,相当于实现近转移

( sp ) = ( sp ) – 2

( (ss)*16+ sp ) = ( ip )

( ip ) = ( ip ) + 16位位移

相当于:

Push ip

Jmp near ptr xxx(行号)

 

<4>call far ptr

把CS。IP压栈处理,然后实现跳转,相当于段间转移。远转移

( sp ) = ( sp ) – 2

( (ss)*16+ sp ) = ( cs )

( sp ) = ( sp ) – 2

( (ss)*16+ sp ) = ( ip )

 

(cs) = 当前行号段地址

(ip) = 当前行号偏移地址

相当于:

Push cs

Push ip

Jmp far ptr xxx

 

<5> call reg(16bit)

跳转到16位寄存器上中存储的地址

( sp ) = (sp) – 2

( (SS)*16 + (sp) ) = (IP)

(IP) = ( 16bit Reg )

相当于:

Push IP

Jmp 16bit Reg

<6> call word ptr 内存单元地址

相当于

Push IP

Jmp word ptr 内存单元地址

如:call word ptr ds:[0]

 

<7> call dword ptr 内存单元地址

相当于

Push cs

Push ip

Jmp dword ptr 内存单元地址

比如:jmp dword ptr DS:[0];

<8>寄存器的冲突问题

主程序调用子程序段的时候,可能子程序会用到主程序中使用的寄存器的值。程序在设计的时候不可能做到不让子程序使用主程序的寄存器,由于两者是相互独立的。你永远不会还有一个会做什么。所以在子程序中採取不使用主程序中调用的寄存器的做法是不可行的。

解决方法:

把寄存器用到的东西,保存到堆栈里面。子程序调用完成。再将堆栈保存的东西弹出。

 

 

转载于:https://www.cnblogs.com/jhcelue/p/7295724.html

相关文章:

  • c# 多线程编程中AutoResetEvent和ManualResetEvent
  • 【Python】 配置文件相对路径软件自动执行的工作目录
  • [SDUT](3361) 数据结构实验之图论四:迷宫探索 ---DFS(图)
  • proxy汇总-1
  • 使用for循环输出九九乘法表
  • ffmpeg学习(二) 通过rtsp获取H264裸流并保存到mp4文件
  • 安装node.js和npm
  • 推荐几款谷歌浏览器的使用插件
  • webservcie学习之webservice是什么
  • Win10《芒果TV》更新v3.6.0秋收版:新增追剧磁贴、记忆续播、跳转列表
  • Centos7安装TensorFlow
  • 没有绝对的cc.ResolutionPolicy.FIXED_WIDTH或cc.ResolutionPolicy.FIXED_HEIGHT
  • Spring 定时任务之 @Scheduled cron表达式
  • Java内存知识整理
  • 嵌入式GPIO接口及操作(一)
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • js中forEach回调同异步问题
  • LeetCode算法系列_0891_子序列宽度之和
  • Node 版本管理
  • pdf文件如何在线转换为jpg图片
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Vue.js源码(2):初探List Rendering
  • Windows Containers 大冒险: 容器网络
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 京东美团研发面经
  • 开源地图数据可视化库——mapnik
  • 跨域
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 判断客户端类型,Android,iOS,PC
  • 前端性能优化--懒加载和预加载
  • 深入浅出Node.js
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 微信开放平台全网发布【失败】的几点排查方法
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​【已解决】npm install​卡主不动的情况
  • #{}和${}的区别是什么 -- java面试
  • ${ }的特别功能
  • (3)选择元素——(17)练习(Exercises)
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)计算机毕业设计高校学生选课系统
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • ... 是什么 ?... 有什么用处?
  • .Net mvc总结
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET 中的轻量级线程安全
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .net实现头像缩放截取功能 -----转载自accp教程网