什么是80x86调用函数指令?

2天前 (11-18 07:36)阅读2回复0
小小的人啊
小小的人啊
  • 管理员
  • 注册排名4
  • 经验值360945
  • 级别管理员
  • 主题72189
  • 回复0
楼主

什么是80 x86调用函数指令?

什么是80x86调用函数指令?

CALL-调用过程代码指令说明E8 cwCALLrel 16位移量是基于近距离调用E8 cdCALLrel 32和FF/2CALLr/m16的绝对间接调用(由FF/2CALL r/m32由r/m16绝对间接调用)的,相对于以下指令:地址由r/m32绝对远程调用9AcdCALLptr 16,地址由操作数9AcpCALLptr 16:32绝对远程调用,FF/3CALLm 16:16由操作数绝对间接调用,FF/3CALLm 16:32地址由m16:16描述为绝对间接和远程调用m16:32,将过程链接信息存储在堆栈中,并分配给指定给目标(调用目标)操作数的过程(调用)。

在调用过程中,目标操作数指定第一个指令的地址。任务数可以是即时数、一般寄存器或内存位置。使用此指令可以执行四种类型的调用。近距离调用-调用当前代码片段(CS寄存器当前指向的段)的过程也称为段内调用。远端调用-在当前片段外调用段的过程,也称为段间调用。远距离调用权限级别-远程调用权限级别与当前执行程序或过程不同段的过程。切换任务-从其他任务调用进程。后两种调用类型(授权级别之间的调用和操作切换)只能在保护模式下执行。最近调用,有关远端调用和权限级别调用的更多信息,请参阅IA-32英特尔(R)系统结构软件开发人员手册第1卷第6章的“使用”Call和RET部分中的“调用过程”。有关使用CALL的更多信息,请参阅命令执行切换IA-32请参阅英特尔(R)系统结构软件开发人员手册第3卷第6章“任务管理”。近距离呼叫。处理器在执行最近一次调用时,将EIP寄存器值(包括)按在堆栈(稍后用作返回指令指针)上。然后,处理器将目标操作数分支到当前片段中指定的地址。指定片段的绝对偏移(相对于代码段的基准位置的偏移),或相对于EIP指令指针寄存器中当前值的符号位移指向CALL指令后面的指令的偏移。在最近一次调用运行时,CS将保留寄存器不变。对于近端调用,从通用寄存器或内存位置的绝对偏移(r/m16或r/m32)间接指定。确定目标操作数的大小(16位或32位)。直接加载绝对偏移EIP寄存器。如果操作数的大小属性为16,则EIP寄存器中的两个高字节将被清除为0,最大大小为16位命令指针。(使用堆栈指针[ESP]基准寄存器间接访问绝对偏移时所使用的默认地址值是执行ESP命令之前的值。)相对偏移(rel16)在组件代码中或在rel32中通常被标记,但在机械代码级别,则编码为符号16位或32位即时。该值将添加到EIP寄存器的值中。对于绝对偏移,确定目标操作数的大小(16位或32位)。实际地址模式或虚拟8086远程呼叫模式。实际地址模式或虚拟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会将寄存器中的两个高字节清除为0。远程调用保护模式。在保护模式下操作处理器时,CALL此命令允许执行三种类型的远程调用:同一权限级别远程调用。远程调用不同权限级别(在权限级别之间调用)。在任务切换(远程调用其他任务)保护模式下,处理器始终使用远程地址的段选择器部分访问对应于GDT或LDT的描述符。描述符类型(代码片段、调用语句、操作语句或TSS)和访问权限决定了要执行的调用操作类型。如果选定的描述符是片段,则执行相同权限级别的代码段远程调用。(如果选择不同权限级别的片段,并且碎片是不符合规定的片段,则会引发常见的保护异常。)在保护模式下执行的相同权限级别远程调用和实际地址模式或虚假8086远程调用在模式下执行非常相似。绝对远程地址由目标操作数使用指针(ptr16):16或ptr16:32直接指定,或使用内存位置(m16:16或m16:32)间接指定。确定距远端地址的偏移大小(16位或32位)。寄存器被加载到EIP寄存器中,而不是新的片段选择器和描述符CS的指令偏移。调用语句(如下所述)也可用于对同一权限级别片段执行远程调用。该机制提供对不同层次的间接调用16位和32这种方法,最适合调用代码片段。执行权限级别间隔调用时,必须通过调用语句访问调用过程的片段。调用语句由目标操作数指定的段选择器确定。同样,指针可以使用目标操作数(ptr16:16或ptr16:32)直接指定调用语句的段选择器,也可以使用内存位置(m16:16或m16:32)间接指定。处理器从调用语句描述符获取新片段的段选择器和新的指令指针(偏移)。(使用调用语句时,将忽略目标操作数的偏移。)在执行权限级别之间调用时,处理器将切换到调用期间的权限级别堆栈。当前,新的堆栈段选择器被指定给正在运行的任务TSS。当堆栈切换时,它们会分支到新片段中。(使用呼叫门远程调用同一权限级别的分段时,不会发生堆栈切换。)在新堆栈中,处理器单击调用过程堆栈中的段选择器和堆栈指针、调用过程堆栈中的一组参数(可选)、调用过程片段的段选择器和指令指针的值。(调用语句描述符的值,该值确定要复制到新堆栈的参数数。)最后,处理器分支到新片段调用过程的地址。使用CALL指令执行操作切换在一定程度上类似于通过语句调用执行调用。其中,目标操作对象指定要切换的操作语句段选择器(忽略目标操作对象的偏移)。任务语句指向任务TSS,其中包含任务代码和堆栈段选择器。TSS还包括在挂任务之前要执行的以下指令。EIP值。指向此指令的指针值被加载到EIP中,在下一个指令中,寄存器可以重新执行操作。CALL指令不需要直接指定TSS段选择器来间接通过操作语句。有关任务切换机制的更多信息,请参阅IA-32英特尔®系统结构软件开发人员手册第3卷第6章“任务管理”。使用CALL切换命令时,EFLAGS存储的嵌套操作标志(NT)为1.“新建TSS旧任务链接”字段和“旧任务TSS”选择器都将载入。代码通过执行可以预期IRET执行。由于指令暂停嵌套操作,因此暂停嵌套操作NT标志为1.的明细栏样式中定义的设置。此指令会自动将以前的操作链接返回到调用操作。有关嵌套操作的详细信息,请参阅IA-32英特尔®系统结构软件开发人员手册第3卷第6部分“操作链接”。如果使用CALL操作和指令切换JMP,则指令会有所不同。由于JMP指令没有将NT标志设置为1,因此IRET指令无法暂停操作。混合16位和32个调用位置。在16位和32位片段之间远程调用时,必须通过调用门进行调用。在32位片段中,16比到t片段的远程调用必须从32位片段的前64KB调用。这是因为指令操作数被设置为大小属性16,所以只能存储16位置来返回地址偏移。您还必须使用16调用门来调用16位门,以便将16位值放入堆栈中。有关16位和32位片段间调用的详细信息,请参阅IA-32英特尔(R)系统结构软件开发人员手册第3卷第16章,请参阅16位和32位位置混合代码。

0
回帖

什么是80x86调用函数指令? 期待您的回复!

取消
载入表情清单……
载入颜色清单……
插入网络图片

取消确定

图片上传中
编辑器信息
提示信息