Intel 64 和 IA-32 架构指令前缀

指令前缀分为四组,每组都有一组允许的前缀代码。对于每条指令,仅包含来自四组(组 1、2、3、4)中的每一组最多一个前缀代码是有用的。第 1 组到第 4 组可以按任何相对彼此的顺序放置。

第 1 组
— Lock and repeat prefixes:
  • LOCK 前缀使用 F0H 进行编码。

    • LOCK前缀用于在多处理器环境下实现原子操作。它可以应用于特定的指令,以确保这些指令在执行期间不会被中断或干扰。LOCK前缀通常与内存操作指令一起使用,例如ADD, SUB, INC, DEC, AND, OR, XOR, NOT, CMPXCHG, XCHG等。它可以确保这些操作是原子的,即在执行期间不会被其他处理器中断或干扰。

    • ; 使用LOCK前缀的ADD指令
      LOCK ADD [address], eax
  • REPNE/REPNZ 前缀使用F2H 进行编码。重复非零前缀仅适用于字符串和输入/输出指令。 (F2H 也用作某些指令的强制前缀。)

    • REPNEREPNZ是相同的前缀,用于指示带有字符串操作的指令在满足特定条件时重复执行。REPNE(或REPNZ)前缀通常与SCAS, CMPS, LODS, MOVS, STOS等字符串操作指令一起使用。它的作用是在指令执行期间重复执行,直到满足特定条件为止。REPNE前缀的行为取决于特定指令的操作。例如,对于SCAS指令,REPNE前缀将重复执行SCAS指令,直到找到与累加器(通常是ALAX)不相等的值或达到指定的重复次数。

    • ; 使用REPNE前缀的SCAS指令
      REPNE SCASB
  • REP 或 REPE/REPZ 使用 F3H 进行编码。重复前缀仅适用于字符串和输入/输出指令。 F3H 还用作 POPCNT、LZCNT 和 ADOX 指令的强制前缀。

    • REP(或REPE/REPZ)前缀是汇编语言中的一个重复前缀,用于指示带有字符串操作的指令在满足特定条件时重复执行。REP前缀通常与SCAS, CMPS, LODS, MOVS, STOS等字符串操作指令一起使用。它的作用是在指令执行期间重复执行,直到满足特定条件为止。REP前缀的行为取决于特定指令的操作。例如,对于SCAS指令,REP前缀将重复执行SCAS指令,直到找到与累加器(通常是ALAX)相等的值或达到指定的重复次数。

    • ; 使用REP前缀的SCAS指令
      REP SCASB

— BND prefix:

BND前缀是Intel x86架构中的一个前缀,用于指示带有绑定检查的指令。绑定检查(Bound Checking)是一种用于数组访问的安全机制,可以检查数组索引是否在有效范围内。BND前缀可以应用于特定的指令,以启用绑定检查。BND前缀通常与MOV, CMP, ADD, SUB, INC, DEC等指令一起使用。它的作用是在执行这些指令时,检查操作数中的索引是否在绑定的范围内

; 使用BND前缀的MOV指令
BND MOV eax, [ebx]

如果满足以下条件,则使用 F2H 对 BND 前缀进行编码:

  • CPUID.(EAX=07H,ECX=0):EBX.MPX[bit14] 已设置。

    • 确保cpu支持MPX功能,MPX(Memory Protection Extensions)是一种硬件扩展,用于提供内存保护和边界检查功能

  • BNDCFGU.EN and/or IA32_BNDCFGS.EN 已设置。

    • BNDCFGU.EN(Bound Configuration User Enable)是一个控制寄存器位,用于启用或禁用MPX功能。当BNDCFGU.EN被设置为1时,MPX功能被启用。

    • IA32_BNDCFGS.EN(Bound Configuration Status Enable)是另一个控制寄存器位,用于指示MPX功能的当前状态。当IA32_BNDCFGS.EN被设置为1时,表示MPX功能已启用。

  • 当F2 前缀位于near CALL、near RET、near JMP、short Jcc 或near Jcc 指令之前时

第 2 组

— Segment override prefixes:

  • 2EH—CS 段覆盖(保留与任何分支指令一起使用)。

    • 2E JMP label
      #2E前缀在JMP指令之前,指示JMP指令应该使用CS寄存器来访问代码段。这样可以覆盖默认的隐式段寄存器,确保JMP指令跳转到正确的代码段。
  • 36H—SS 段覆盖前缀(保留与任何分支指令一起使用)。

  • 3EH—DS 段覆盖前缀(保留与任何分支指令一起使用)。

  • 26H—ES 段覆盖前缀(保留与任何分支指令一起使用)。

  • 64H—FS 段覆盖前缀(保留与任何分支指令一起使用)。

  • 65H—GS 段覆盖前缀(保留与任何分支指令一起使用)。

— Branch hints(分支提示):

  • 用于向处理器提供关于分支指令的额外信息,以优化分支预测和执行。

  • 2EH — 未采取分支(仅与Jcc 指令一起使用)。

    • Not Taken(NT):表示分支预测应该假设分支不会被执行(跳转未发生)。

  • 3EH—采取分支(仅与Jcc 指令一起使用)。

    • Taken(T):表示分支预测应该假设分支会被执行(跳转发生)。

第 3 组

— Operand-size override prefix:

  • Operand-size override prefix (0x66):用于将指令的操作数大小从默认的16位改为32位。这个前缀通常用于在16位模式下使用32位操作数。

第 4 组

— Address-size override prefix:

  • Address-size override prefix (0x67):用于将指令的地址大小从默认的32位改为16位。这个前缀通常用于在32位模式下使用16位地址。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

What’smean

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值