x86指令前缀字节编码顺序

10

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

如果有多个前缀,它们应该以特定的顺序出现吗?

3个回答

5

这个指令的顺序可以在英特尔软件开发手册(第2A卷)中找到。

简而言之:

  • F2F3前缀相互抵消,后出现的优先级更高。
  • 如果长指令有强制前缀F2F3,则会忽略66前缀。当然,对于rep movsw,这两个前缀只是前缀,不是操作码的一部分,因此不适用上述规则。
  • REX转义不能跟随其他前缀。
  • VEX转义不能以REX,66F2F3为前缀。

除了以上内容,其他顺序应该没有关系。


1
如果提供了F2,那么66就会被忽略?什么鬼?你不能在32位模式下使用rep movsw吗? - fuz
2
请注意,我在英特尔手册中找不到您提到的第二条规则,因此我认为它是错误的,暂时会将其点踩。 - fuz
2
如果在SSE指令中同时使用F2和F3,则最后一个被使用的将会生效,如果存在其他前缀,则66将被忽略。 - phuclv
2
@LưuVĩnhPhúc movsw不是SSE指令,因此答案应该更新以明确说明这仅适用于SSE指令。再次强调,您链接的答案没有引用权威来源,Reddit评论也没有。这可能只是实现定义的行为。 - fuz
1
@NathanFellman:问题不在于MOVSB,而在于MOVSD与MOVSW。8位操作数大小使用单独的操作码,16/32/64使用前缀,其中32位是32/64位模式下的默认值。https://www.felixcloutier.com/x86/movs:movsb:movsw:movsd:movsq显示A5是`movsw`和`movsd`的操作码,但我们知道这两个指令都可以在任何模式下使用REP前缀,在必要时使用`66`操作数大小前缀。 - Peter Cordes
显示剩余2条评论

2

摘自Intel® 64和IA-32架构软件开发人员手册第2A卷:指令集参考,A-M

指令前缀分为四组,每组有一组允许的前缀码。对于每个指令,只有在每个四组中选择一个前缀码才有用(1组,2组,3组,4组)。1到4组可以相对于彼此放置。


1

英特尔开发手册的架构卷详细描述了布局,但是从我上次阅读它的记忆中,大多数情况下顺序并不重要,REX/REX.W前缀必须占据最靠近实际指令字节开头的位置(也就是占据最右侧的位置)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接