《intel开发手册卷1》学习笔记3

1、数据传输指令

MOV 指令在内存和处理器寄存器之间执行基本的加载数据和存储数据操作,并在寄存器之间执行数据移动操作。MOV 指令不能将数据从一个内存位置移动到另一个内存位置,也不能将数据从一个段寄存器移动到另一个段寄存器。内存到内存的移动使用 MOVS(字符串移动)指令执行。

2、跳转指令

        JMP指令——JMP(跳转)指令无条件地将程序控制转移到目标指令。转移是单向的;也就是说,不会保存返回地址。目标操作数指定目标指令的地址(指令指针)。地址可以是相对地址也可以是绝对地址。相对地址是相对于EIP寄存器中的地址的位移(偏移量)。目的地址(一个近指针)是通过在EIP寄存器的地址上加上位移而形成的。位移用有符号整数指定,允许在指令流中向前或向后跳转。在保护模式下,JMP指令还允许跳转到调用门、任务门和任务状态段。

        CALL和RET——Call(调用过程)和RET(从过程返回)指令允许从一个过程(或子例程)跳转到另一个过程(或子例程),并随后跳转回(返回)到调用过程。CALL指令将程序控制从当前(或调用)过程转移到另一个过程(被调用过程)。为了允许随后返回到调用过程,CALL指令在跳转到被调用过程之前将EIP寄存器的当前内容保存在堆栈上。EIP寄存器(在转移程序控制之前)包含CALL指令之后的指令的地址。当这个地址被压入堆栈时,它被称为返回指令指针或返回地址。RET指令将程序控制从当前正在执行的过程(被调用过程)转移回调用它的过程(调用过程)。控制的转移是通过将返回指令指针从堆栈复制到EIP寄存器来完成的。然后程序继续执行EIP寄存器所指向的指令。RET指令有一个可选操作数,它的值作为返回操作的一部分被添加到ESP寄存器的内容中。此操作数允许对堆栈指针进行递增,以从调用过程在堆栈上压入的堆栈中删除参数

INT n(软件中断)、INTO(溢出时中断)和 BOUND(检测值超出范围)指令允许程序明确引发指定的中断或异常,进而导致中断或异常的处理程序被调用。INT n 指令通过在指令中编码中断或异常的向量,可以引发处理器的任何中断或异常。该指令可用于支持软件生成的中断,或测试中断和异常处理程序的运行。IRET(从中断返回)指令将程序控制从中断处理程序返回到被中断的程序。

        IRET指令——当处理器处理中断时,它执行对中断处理过程的隐式调用。 IRET(从中断返回)指令将程序控制从中断处理程序返回到被中断的过程(即,中断发生时正在执行的过程)。IRET 指令执行与 RET 指令类似的操作,不同之处在于它还从堆栈中恢复 EFLAGS 寄存器。当处理器处理中断时,EFLAGS 寄存器的内容与返回指令指针一起自动存储在堆栈中

3、字符串操作隐含规则

默认情况下,ESI 寄存器的地址段由 DS 段寄存器确定。段覆盖前缀允许 ESI 寄存器与 CS、SS、ES、FS 或 GS 段寄存器相关联。EDI 寄存器的地址段由 ES 段寄存器确定;EDI 寄存器不允许段覆盖。在字符串指令中使用两个不同的段寄存器,可以对位于不同段的字符串执行操作。或者,通过将 ESI 寄存器与 ES 段寄存器关联,源字符串和目标字符串可以位于同一段中。

        CMPS 指令从源字符串元素中减去目标字符串元素,并根据结果更新 EFLAGS 寄存器中的状态标志(CF、ZF、OF、SF、PF 和 AF)。两个字符串元素都不会写回内存。

        LODS 指令将 ESI 寄存器标识的源字符串元素装入 EAX 寄存器(双字字符串)、AX 寄存器(字字符串)或 AL 寄存器(字节字符串)。

        STOS 指令将 EAX(双字串)、AX(字串)或 AL(字节串)寄存器中的源字符串元素存储到 EDI 寄存器标识的内存位置。

在字符串指令中使用时,ESI 和 EDI 寄存器会在指令每次迭代后自动递增或递减,以指向字符串中的下一个元素(字节、字或双字)。因此,字符串操作可以从较高的地址开始,然后向较低的地址移动,也可以从较低的地址开始,然后向较高的地址移动。EFLAGS 寄存器中的 DF 标志控制寄存器是递增(DF = 0)还是递减(DF = 1)。STD 和 CLD 指令分别设置和清除该标志

4、段寄存器操作指令

MOV 指令以及 PUSH 和 POP 指令可以将 16 位段选择器传输到段寄存器(DS、ES、FS、GS 和 SS)或从中传输。传输始终在段寄存器和通用寄存器或内存之间进行,但不支持段寄存器之间的传输。 POP 和 MOV 指令无法将值放入 CS 寄存器中。只有 JMP、CALL 和 RET 指令的远控制传输版本会直接影响 CS 寄存器。

        JMP 和 CALL 指令均接受远指针作为目标,以将程序控制转移到 CS 寄存器当前指向的段以外的段。当使用CALL指令进行远调用时,EIP和CS寄存器的当前值都被压入堆栈

        RET 指令可用于执行远距离返回。在这里,程序控制从包含被调用存储过程的代码段转移回包含调用存储过程的代码段。RET 指令从堆栈中恢复调用存储过程的 CS 和 EIP 寄存器的值。

        加载远指针指令 LDS(使用 DS 加载远指针)、LES(使用 ES 加载远指针)、LFS(使用 FS 加载远指针)、LGS(使用 GS 加载远指针)和 LSS(使用 SS 加载远指针)将远指针从内存加载到段寄存器和通用通用寄存器中。远指针的段选择器部分被加载到所选的段寄存器中,并且偏移量被加载到所选的通用寄存器中。

        LEA(加载有效地址)指令计算源操作数在内存中的有效地址(段内的偏移量)并将其放入通用寄存器中。该指令可以解释处理器的任何寻址模式,并且可以执行可能需要的任何索引或缩放。它对于在执行字符串指令之前初始化 ESI 或 EDI 寄存器或在 XLAT 指令之前初始化 EBX 寄存器特别有用。

        NOP(无操作)指令递增 EIP 寄存器以指向下一条指令,但不影响其他任何操作。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值