[英]Assembly language CALL instruction
(CS) = 1075H, (IP) = 0300H,执行以下指令前:
呼叫 1000H
程序控制传递到什么地址? 指令执行后CS和IP的新值是多少?
要回答这个问题,请考虑call
指令的作用。
如果您不确定,请查看:
在实地址或虚拟 8086 模式下执行远调用时,处理器将 CS 和 EIP 寄存器的当前值压入堆栈以用作返回指令指针。 然后,处理器执行到代码段的“远分支”和被调用过程的目标操作数指定的偏移量。
此处目标操作数直接使用指针(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
工作方式。在指令解码时内部设置为指向下一条要执行的指令。因此,在执行call
指令时, IP
指向到调用后的指令。因此,当您返回并弹出IP
,您将在call
后开始执行。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.