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