特别是Olly,如果同一组中有多个前缀,则仅接受找到的最后一个前缀。例如,

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上运行它,然后观察会发生什么。