汇编语言CALL指令

时间:2016-12-21 15:31:13

标签: assembly x86

在执行以下指令之前,

(CS)= 1075H,(IP)= 0300H:

CALL 1000H

通过程序控制的地址是什么?指令后CS和IP的新值是多少? 被执行了吗?

1 个答案:

答案 0 :(得分:3)

要回答这个问题,请考虑call指令的作用 如果您不确定,请look it up

  

在实地址或虚8086模式下执行远程调用时,处理器将CS和EIP寄存器的当前值压入堆栈,以用作返回指令指针。然后处理器执行一个" far分支"到被调用过程的目标操作数指定的代码段和偏移量。

     

这里,目标操作数直接用指针(ptr16:16或ptr16:32)指定绝对远地址,或者间接指定存储单元(m16:16或m16:32)。使用指针方法,被调用过程的段和偏移量在指令中使用4字节(16位操作数大小)或6字节(32位操作数大小)远地址立即编码。使用间接方法,目标操作数指定包含4字节(16位操作数大小)或6字节(32位操作数大小)远地址的内存位置。操作数大小属性确定远地址中的偏移量(16或32位)。远地址直接加载到CS和EIP寄存器中。如果操作数大小属性为16,则清除EIP寄存器的高两个字节。

您被告知IP(指令指针)为300H,而CS(代码段)为1075H。文件说什么会发生什么?

  1. 首先,CSIP将被推入堆栈,以便在从通话中返回时使用。

  2. 然后,处理器分支到指定的代码段并偏移 在这种情况下,这将是1000H

    这会如何影响CSIP?好吧,CS将是相同的,因为您没有更改细分,但IP会发生变化。为什么IP会改变?想想IP 是什么:它是指向即将执行的指令的指针。如果执行跳转到1000H,那么即将执行的指令显然为1000H,因此IP将为1000H

  3. retcall后会发生什么?弹出CSIP(由call推入堆栈的那些)。 CS仍然无法更改,但IP现在将再次300H

    (注意,这将创建一个无限循环。为什么?由于IP的工作方式。它在指令解码期间内部设置为指向 next 要执行的指令。因此,当执行call指令时,IP指向调用后的指令。因此,当你返回并弹出{ {1}},您将在 IP之后开始执行。)