• 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位地址。

  • 相关阅读:
    LeetCode 2333. 最小差值平方和(贪心)
    物联网技术融合成为新趋势,LPWAN2.0泛在物联·ZETA生态大会在深圳召开
    区域气象-大气化学在线耦合模式(WRF/Chem)在大气环境领域实践技术应用
    视口 css
    如何将视频压缩?快来看看这些方法
    postgresql数据库|wal日志的开启以及如何管理
    淘宝/天猫api 收货地址列表 API接口
    这些大厂笔试题 你都见识(指被无情鞭挞)过了吗?—— 哔哩哔哩篇
    ODOO原生会计6大核心业务凭证生成详细说明(干货!)
    初识vue里的路由
  • 原文地址:https://blog.csdn.net/weixin_42492218/article/details/134517945