(CS)= 1075H,(IP)= 0300H:
CALL 1000H
通过程序控制的地址是什么?指令后CS和IP的新值是多少? 被执行了吗?
答案 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
。文件说什么会发生什么?
首先,CS
和IP
将被推入堆栈,以便在从通话中返回时使用。
然后,处理器分支到指定的代码段并偏移
在这种情况下,这将是1000H
。
这会如何影响CS
和IP
?好吧,CS
将是相同的,因为您没有更改细分,但IP
会发生变化。为什么IP
会改变?想想IP
是什么:它是指向即将执行的指令的指针。如果执行跳转到1000H
,那么即将执行的指令显然为1000H
,因此IP
将为1000H
。
ret
后call
后会发生什么?弹出CS
和IP
(由call
推入堆栈的那些)。 CS
仍然无法更改,但IP
现在将再次300H
!
(注意,这将不创建一个无限循环。为什么?由于IP
的工作方式。它在指令解码期间内部设置为指向 next 要执行的指令。因此,当执行call
指令时,IP
指向调用后的指令。因此,当你返回并弹出{ {1}},您将在 IP
之后开始执行。)