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寄存器的修改、入栈、出栈操作是处理器自动处理的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值