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

汇编:call与ret/retf指令

 一、call指令

​​​​​​​   1.1 依据位移进行转移:call 标号

   1.2 实现段间转移:call far ptr 标号

   1.3 转移地址在寄存器中:call 16位寄存器

   1.4 转移地址在内存中

        1.4.1 call word ptr 内存单元地址

        1.4.2 call dword ptr 内存单元地址

 二、ret和retf指令

    2.1 ret指令:近转移

    2.2 retf指令:远转移


     call和ret指令都是转移指令,它们都能修改ip,或同时修改cs和ip。call和ret需要配合使用。

一、call指令

    CPU执行call指令,进行两步操作:

  •    将当前的ip或cs和ip压入栈中
  •    转移

    call指令不能实现短转移,除此之外,call指令实现转移的方法和jmp指令的原理相同。

   1.1 依据位移进行转移:call 标号

        执行的操作如下:

  •     (sp) = (sp)-2               ;栈顶移动
  •     ((ss)*16+(sp)) = (ip)   ;当前ip内容压栈
  •     (ip) = (ip)+16位位移   ;跳转到标号处

        相当于执行:

  •     push ip
  •     jmp near ptr 标号
   1.2 实现段间转移:call far ptr 标号

        执行的操作如下:

  •     (sp) = (sp)-2                 ;栈顶移动
  •     ((ss)×16+(sp)) = (cs)   ;先把cs压栈
  •     (sp) = (sp)-2                ;栈顶移动
  •     ((ss)×16+(sp)) = (ip)    ;然后把ss压栈

        相当于执行:

  •      push cs
  •      push ip
  •      jmp far ptr 标号
  1.3 转移地址在寄存器中:call 16位寄存器

        执行的操作如下:

  •     (sp) = (sp) - 2
  •     ((ss) × 16 + (sp)) = (ip)
  •     (ip) = (16位寄存器)

        相当于执行:

  •      push ip
  •      jmp 16位寄存器
  1.4 转移地址在内存中
    1.4.1 call word ptr 内存单元地址

        汇编语法解释:

  •      push ip
  •      jmp word ptr 内存单元地址
    1.4.2 call dword ptr 内存单元地址

        汇编语法解释:

  •       push cs  
  •       push ip     
  •       jmp dword ptr 内存单元地址

二、ret和retf指令

    2.1 ret指令:近转移

        ret指令用栈中的数据,修改ip的内容,从而实现【近转移
        CPU执行ret指令时,进行下面两步操作:

  •      (ip)=((ss)*16+(sp))   ;ip的值修改为栈顶的内容
  •      (sp)=(sp)+2              ;栈顶移动

        相当于执行:

  •      pop ip
    2.2 retf指令:远转移

        retf指令用栈中的数据,修改cs和ip的内容,从而实现【远转移
        CPU执行retf指令时,进行下面四步操作

  •      (ip)=((ss)*16+(sp))   ;ip的内容修改为栈顶的内容
  •      (sp)=(sp)+2              ;栈顶移动
  •      (cs)=((ss)*16+(sp))   ;cs的内容修改为栈顶移动之后,栈顶的内容
  •      (sp)=(sp)+2              ;栈顶移动

        相当于执行:

  •       pop ip
  •       pop cs
http://www.lryc.cn/news/251094.html

相关文章:

  • Fiddler抓包工具之高级工具栏中的重定向AutoResponder的用法
  • 如何基于OpenCV和Sklearn库开展数据降维
  • 详解SpringAop开发过程中的坑
  • 【海思SS528 | VDEC】MPP媒体处理软件V5.0 | VDEC的使用总结
  • Kubernetes sample-controller 例子介绍
  • 【C/C++指针】指针*与引用的区别
  • 【ArcGIS Pro微课1000例】0039:制作全球任意经纬网的两种方式
  • 【二叉树】练习题终章
  • flutter开发实战-实现获取视频的缩略图封面video_thumbnail
  • Prompt Toolkit探索:打造交互式CLI应用
  • 【已解决】AttributeError: module ‘gradio‘ has no attribute ‘outputs‘
  • WPF Mvvm模式下面如何将事件映射到ViewModel层
  • C# WPF上位机开发(计算器界面设计)
  • [c]比较月亮大小
  • 【Java 基础】16 泛型
  • Android framework定制1-->用户无操作一段时间,自动播放客户提供的视频,用户操作后退出播放
  • Vmware17虚拟机安装windows10系统
  • Golang实践录:读取yaml配置文件
  • oracle sql相关语法
  • el-table,列表合并,根据名称列名称相同的品名将其它列值相同的进行合并
  • 微信小程序显示二维码?
  • JavaWeb开发全流程笔记
  • LLM;超越记忆《第 2 部分 》
  • Python中的加法测试题实现
  • 使用gcloud SDK 管理和部署 Cloud run service
  • JS逆向-mytoken之code参数
  • 第九节HarmonyOS 常用基础组件4-Button
  • 常用数据预处理方法 python
  • 【无标题】AttributeError: module ‘gradio‘ has no attribute ‘outputs‘
  • 无人机助力电力设备螺母缺销智能检测识别,python基于YOLOv7开发构建电力设备螺母缺销小目标检测识别系统