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

Assembly 编码x86指令前缀字节的顺序,assembly,x86,Assembly,X86,我知道x86指令最多可以有4个字节的前缀,例如Lock、rep、段重写等 在使用多个前缀的情况下,它们是否有特定的显示顺序?引自《英特尔64和IA-32体系结构软件开发人员手册》第2A卷:指令集参考,A-M 指令前缀分为四组,每组有一组 允许的前缀代码。对于每一条指令,只需 从四个组(组1, 2, 3, 4). 第1组至第4组可按与以下各项相关的任何顺序排列: 彼此 该订单可在《英特尔软件开发人员手册》第2A卷中找到 简言之: F2和F3前缀相互抵消。后面来的有优先权 如果使用F2或F3作为长

我知道x86指令最多可以有4个字节的前缀,例如Lock、rep、段重写等


在使用多个前缀的情况下,它们是否有特定的显示顺序?

引自《英特尔64和IA-32体系结构软件开发人员手册》第2A卷:指令集参考,A-M

指令前缀分为四组,每组有一组 允许的前缀代码。对于每一条指令,只需 从四个组(组1, 2, 3, 4). 第1组至第4组可按与以下各项相关的任何顺序排列: 彼此


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

简言之:

  • F2
    F3
    前缀相互抵消。后面来的有优先权
  • 如果使用
    F2
    F3
    作为长指令中的强制前缀,则忽略
    66
    前缀。这当然不适用于
    rep movsw
    ,因为这两个前缀都只是前缀,而不是操作码的一部分
  • REX escape后面不能跟任何其他前缀
  • VEX escape前面不能有REX、
    66
    F2
    F3

对于其他人来说,顺序应该无关紧要。

英特尔开发人员手册的体系结构部分详细介绍了整个布局,但是,从我上次阅读时的记忆来看,顺序对大多数人来说并不重要,除非
REX
/
REX.W
前缀必须占用最接近实际指令字节开头的插槽(即它占据最右边的插槽)

66,否则如果提供F2,则忽略该前缀?世界跆拳道联盟?您不能在32位模式下执行
rep movsw
吗?在32位和64位模式下,操作码
a5
表示
movsl
(分别为英特尔语法中的
movsd
),因为默认操作数大小为32位。因此,要获得
movsw
,需要使用
66
前缀。因此,
rep movsw
66 f3 a5
,您说这是无效的。这很奇怪。请注意,我在英特尔手册中找不到您的第二条规则,所以让我暂时否决这条规则,因为我认为它是不正确的。@fuz@LưuVĩnhPhúc
movsw
不是SSE指令,因此应更新答案以明确这只适用于SSE指令。同样,你链接到的答案没有引用权威来源,reddit的评论也没有引用。可能只是实现定义的行为。