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