编码x86指令前缀字节的顺序

pan*_*kaj 9 x86 assembly

我知道x86指令最多可以包含4个字节的前缀,例如Lock,rep,segment overrides等.

如果使用多个前缀,是否应该出现任何特定顺序?

Nat*_*man 5

该订单可在英特尔软件开发人员手册的第2A卷中找到.

简而言之:

  • F2F3前缀相互抵消.后来的那个优先.
  • 所述66,如果任一前缀被忽略F2F3被使用(如强制前缀在长指令).这当然不适用于rep movsw这些前缀只是前缀而不是操作码的一部分.
  • REX转义可能不会跟随任何其他前缀.
  • VEX转义可能不在REX之前66,F2F3

其余的,订单无关紧要.

  • 在 32 位和 64 位模式下,操作码“a5”表示“movsl”(或 Intel 语法中的“movsd”),因为默认操作数大小为 32 位。因此,要获得“movsw”,您需要使用“66”前缀。因此,“rep movsw”是“66 f3 a5”,你说它是无效的。这很奇怪。 (2认同)
  • 请注意,我在英特尔手册中找不到您的第二条规则,所以让我暂时将其归结为此,因为我认为这是不正确的. (2认同)
  • @fuz [*如果 F2 和 F3 都与 SSE 指令一起使用,那么最后一个“获胜”,如果存在其他前缀,则忽略 66*](https://reverseengineering.stackexchange.com/a/3880/第2563章 (2认同)
  • @LưuVĩnhPhúc`movsw`不是SSE指令,因此应该更新答案以明确,这仅适用于SSE指令.再次,你链接的答案并没有引用权威来源,它引用的reddit评论也没有.可能只是实现定义的行为. (2认同)

pez*_*ode 2

引自 Intel\xc2\xae 64 和 IA-32 架构软件开发人员\xe2\x80\x99s 手册第 2A 卷:指令集参考,AM

\n\n
\n

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

\n
\n