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

X86架构(六)——过程调用

  • call 指令
  1. 16位相对近调用
    近调用的被调用的目标过程位于当前代码段内,操作数为对应的偏移地址。因为是相对调用,故该操作数是当前call 指令相对于目标过程的偏移量。在指令执行阶段,处理器看到call指令时,将用指令指针寄存器IP的当前内容加上指令中的操作数,再加上3(call指令长度),得到一个新的偏移地址。接着,将IP 的原有内容压入栈。最后,用刚才计算出的偏移地址取代IP 原有的内容。这直接导致处理器的执行流转移到目标位置处。
call near __proc
;近调用的特征是在指令中使用关键字`near`
;`__proc`是程序中的一个标号
;在编译阶段,编译器用标号`__proc`处的汇编地址减去本指令的汇编地址,再减去3,作为机器指令的操作数
;`near`可被省略
  1. 16 位间接绝对近调用
    指令中的操作数是被调用过程的真实偏移地址,故称为绝对地址。该偏移地址由16 位的通用寄存器或者16 位的内存单元间接给出,所以叫16位间接绝对近调用
;间接绝对近调用指令在执行时,处理器计算被调用过程的偏移地址
;然后将指令指针寄存器IP的当前值压栈,最后用计算出来的偏移地址取代寄存器IP原有的内容
call cx			;目标地址在cx寄存器中
call [0x3000]	;访问目标内存取得目标偏移地址
call [bx]
call [bx+si+0x02] 
  1. 16位直接绝对远调用
    这种调用属于段间调用
    处理器在执行时,将代码段寄存器CS的当前内容压栈,再把指令指针寄存器IP的当前内容压栈。之后,用指令中给出的段地址代替CS原有的内容,用指令中给出的偏移地址代替IP原有的内容。这直接导致处理器从新的位置开始执行。
call 0x2000:0x0030
;目的操作数为[偏移地址:段地址]
  1. 16 位间接绝对远调用
    这种调用属于段间调用,被调用过程所在的段地址和偏移地址是间接给出的
call far [0x2000]
call far [bx]
call far [bx+si]
;内存中的字也是按照偏移地址在前,段地址在后进行排列的
  • ret 指令
    ret 是近返回指令,当它执行时,处理器从栈中弹出一个字到指令指针寄存器IP中
  • retf 指令
    retf 是远返回指令,当它执行时,处理器分别从栈中弹出两个字到指令指针寄存器IP和代码段寄存器CS中

NOTE
call 指令和ret/retf 指令对CS和IP寄存器的修改、入栈、出栈操作是处理器自动处理的


http://www.mrgr.cn/news/18373.html

相关文章:

  • 正则表达式优化建议
  • 【网络安全】Bingbot索引投毒实现储存型XSS
  • 数据解读——基于《择偶偏好中的性别差异和社会阶层异质性——基于选择实验法的探索》
  • 【最新华为OD机试E卷】最大报酬(100分)-多语言题解-(Python/C/JavaScript/Java/Cpp)
  • MFC dll无法显示tooltip问题
  • 仿论坛项目--第二部分习题
  • 【Next.js 入门指南】5分钟创建你的第一个 Next.js 应用
  • 华为云征文 | 华为云Flexus云服务器X实例之Docker环境下部署JmalCloud个人网盘
  • Linux运维--Firewall防火墙命令以及规则等详解(全)
  • 奉加微PHY6233进入DTM模式;TX单音信号;
  • 【高校科研前沿】三峡大学黄进副教授等人在环境科学Top期刊JCP发文:人类活动如何在气候变化下影响和降低生态敏感性:以中国长江经济带为例
  • 基于Python实现AES加密与解密
  • CNN中的注意力机制综合指南:从理论到Pytorch代码实现
  • 大数据系列之:查看Centos服务器用户可以创建的最大线程数、查看系统内核支持的最大线程数、查看系统支持的最大进程数、设置最大线程数限制、查看进程使用的线程数
  • C++系列-STL容器中的for循环遍历方式
  • 华为云征文|基于华为云Flexus X实例部署Redis及案例实践详解
  • MySQL主从同步
  • 沉浸式体验亚马逊云科技上私有化部署零一万物AI大模型
  • 2222. 分糖果(candy)
  • 深度解析MFT损坏:原因、恢复策略与预防措施