lock rep add dword ptr[eax],eax ; f0 f3 01 00
成为
??? ; f0
rep add dword ptr[eax],eax ; f3 01 00
英特尔体系结构手册的第28页简单地指出“可以在四个组中的每个组中最多包含一个前缀代码...”,但没有说明在每个组中最多只包含一个前缀代码的地方。是的,在某些情况下,某些前缀是必需的,必须不存在或仅在某些情况下才有效,具体取决于指令,但我不是在指这些情况中的任何一种。
我是选择将Intel的指导解释为“有效,但没有太多理由”,并且我将继续在指令中列出前缀(再次,除非另有规定,否则除外)。
这是处理情况的正确方法还是应该做一些不同的事情?
#1 楼
一般的经验法则是每个前缀都按顺序应用。例如,两个66
前缀相互抵消,而66 66 66
与单个66
相同。编辑:看来我错了,重复的前缀被忽略了。
对于SSE指令,情况变得有些混乱,其中某些前缀是必需的而某些前缀是可选的,并且它们的顺序可能很重要。例如,如果F2和F3都与SSE指令一起使用,则最后一个“获胜”,如果存在其他前缀(忽略一些指令(如CRC32等),则忽略66)。
66 f3 f2 0f 59 ff ; mulsd xmm7, xmm7
66 f2 f3 0f 59 ff ; mulss xmm7, xmm7
66 0f 59 ff ; mulpd xmm7, xmm7
f2 66 0f 59 ff ; mulsd xmm7, xmm7
通常,文档不能很好地描述极端情况。因此,最好的办法是将一些字节放入文件中,在实际的CPU上运行它,然后观察会发生什么。