Assembly 汇编语言调用指令

Assembly 汇编语言调用指令,assembly,x86,Assembly,X86,(CS)=1075H,(IP)=0300H,然后执行以下指令: 拨打1000小时 程序控制传递到哪个地址?说明后CS和IP的新值是多少 是否执行?要回答此问题,请思考调用指令的作用。 如果您不确定,则: 在实地址或虚拟8086模式下执行远端调用时,处理器将CS和EIP寄存器的当前值推送到堆栈上,用作返回指令指针。然后,处理器对被调用过程的代码段和用目标操作数指定的偏移量执行“远分支” 这里,目标操作数直接使用指针(ptr16:16或ptr16:32)或间接使用内存位置(m16:16或m16:32

(CS)=1075H,(IP)=0300H,然后执行以下指令:

拨打1000小时

程序控制传递到哪个地址?说明后CS和IP的新值是多少
是否执行?

要回答此问题,请思考
调用
指令的作用。
如果您不确定,则:

在实地址或虚拟8086模式下执行远端调用时,处理器将CS和EIP寄存器的当前值推送到堆栈上,用作返回指令指针。然后,处理器对被调用过程的代码段和用目标操作数指定的偏移量执行“远分支”

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

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

  • 首先,
    CS
    IP
    将被推到堆栈上,以便以后从调用返回时使用

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

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

  • 调用
    返回
    后会发生什么?旧的
    CS
    IP
    (被
    call
    推到堆栈上的那些)弹出
    CS
    仍然不会更改,但
    IP
    现在将再次
    300H


    (请注意,这不会创建无限循环。为什么?因为
    IP
    的工作方式。它在指令解码期间内部设置为指向要执行的下一条指令。因此,当执行
    call
    指令时,
    IP
    指向调用后的指令。因此,当您返回时然后弹出
    IP
    ,您将在
    调用之后开始执行

    (CS)=1075H,(IP)=1000H您能解释一下IP是如何变成1000H的吗?调用会推动当前IP(以便能够返回),并跳到给定的地址。所以“call 1000”跳转到1000,IP是1000你用调试器试过了吗?我想你会发现你可以很快回答你自己的问题。我有点错过了在
    调用
    执行
    推IP
    过程中“当前
    IP
    ”实际上已经指向下一条指令的信息(因为
    call
    指令在
    call
    一次之后已经被解码,并且
    ip
    内部更新)........
    ret
    将创建无限循环。.)嗯,不,它不会产生一个无限循环,正是因为
    IP
    按照你描述的方式工作。我想我应该在答案中明确地包括这一点。不幸的是,这么多家庭作业式的问题就是这样。你知道的越多,它们就越难理解。你为什么认为这是
    far
    call?在NASM中,
    call 1000h
    汇编到编码中,这是一个近调用,只推IP,而不是CS:IP。要获得对同一段的直接远调用,您必须编写类似于
    call 1075H:1000h
    的代码(即硬编码当前CS值).Hmm,我想知道你是否可以用
    push cs
    /
    call rel16
    模拟一个远呼叫;我忘记了段值是否在较高的地址。当你把简单任务交给学生时……三个asm专家思考了几个小时……(有趣)