gpt4 book ai didi

assembly - 'escape opcode' 是什么意思?

转载 作者:行者123 更新时间:2023-12-05 09:15:30 25 4
gpt4 key购买 nike

intel software developers manual volumen 2A chapter 2.1.2

Two-byte opcode formats for general-purpose and SIMD instructions consist of one of the following:

  • An escape opcode byte 0FH as the primary opcode and a second opcode byte.
  • A mandatory prefix (66H, F2H, or F3H), an escape opcode byte, and a second opcode byte (same as previous bullet).

什么是“转义操作码”,它的用途是什么?

最佳答案

“转义”代码通常是修改下一个字节/符号的含义的代码,而不是它自己的意思。

例如,在 ASCII 键盘输入中(例如在 Linux 终端上),alt + 字母通常作为转义符 + 字母发送。 (在 ASCII ESC character is 0x1b 的位置,所以如果我运行 hd (hexdump) 并在其中键入 alt+x,我会得到 1b 78 来自修改后的击键。

或者在双引号 C 字符串中,n 只是一个普通字母。但是 \n 意味着不同的东西:它是一个换行符,仍然是一个字符(在编译器处理转义序列之后)。反斜杠转义了 n,所以它有其他含义。


x86 机器代码有许多单字节操作码(如 00 ADD r/m8, r8 ),但一些字节值(如 0F)是多字节操作码的第一个字节,而不是一个整体自己的操作码。

通过使用一个单字节操作码 (0f) 来提供另外 256 个 2 字节,从而从 256 个可能的操作码(加上 ModRM 字节的/r 字段中的重载)扩展了编码空间操作码。

例如,0F AF is IMUL r32, r/m32 , 和 0F B6 is movzx r32, r/m8 .这些通用指令是在最初的 8086 之后引入的,并且没有留下编码空间来为它们提供单字节操作码。 (或者英特尔将其保存以供将来转义序列使用。)


66 等强制性前缀与扩展编码空间以允许编码更多不同操作码的想法类似,使用在其他上下文中具有不同含义的字节而不是仅使用字节曾经是转义字节(当出现在操作码的开头时)。

这些字节是操作数大小,REP/REPE, and REPNE与那些前缀有意义的操作码一起使用时的前缀。但是对于某些指令,这些前缀没有意义:操作码已经暗示了单个操作数大小,并且它不是字符串指令。 (请注意,地址大小前缀和段覆盖前缀可以应用于具有显式内存操作数的任何指令,因此不用作强制性前缀。lock 也不是。)

像MMX这样的指令0F FC paddb mm0, mm1/m64已经有一个固定的 SIMD 操作数大小。这些前缀都没有意义。英特尔选择(针对 SSE2)制作 XMM 版本 66 0F FC PADDB xmm1, xmm2/m128,为 MMX 编码添加操作数大小前缀。

类似地,F3 0F 59 MULSS xmm1,xmm2/m32mulps + 一个 REP 前缀。

Intel 已将 rep 用作某些非 SIMD 指令的强制性前缀。例如pauserep noptzcntrep bsf(这很有趣,因为它们在 CPU 上做同样的事情/没有 BMI1,除非输入为零)。这允许向后兼容,因为通常 CPU 会忽略它们不理解为应用的 REP 前缀。

(不过,故意使用不适用的 REP 前缀作为填充并不是 future 的证明,因为编码可能会在未来的 CPU 中获得一些意义。但是当新旧意义都已知时,英特尔通常会保证所有旧 CPU 解码 rep nop 就像 nop 一样,可以安全地在自旋循环中使用 pause 而无需检查 CPUID 功能位。)

关于assembly - 'escape opcode' 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52346724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com