繁体   English   中英

汇编语言 CALL 指令

[英]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 文档说会发生什么?

  1. 首先,当从调用返回时, CSIP将被压入堆栈以备后用。

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

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

你以后会发生什么retcall 旧的CSIP (通过call压入堆栈的那些)被弹出。 CS仍然不会改变,但IP现在又是300H了!

(注意这不会造成死循环。为什么?因为IP工作方式。在指令解码时内部设置为指向一条要执行的指令。因此,在执行call指令时, IP指向到调用的指令。因此,当您返回并弹出IP ,您将在call开始执行。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM