在x86中重复前缀和强制前缀

在x86中重复前缀和强制前缀,x86,opcode,instruction-set,prefixes,X86,Opcode,Instruction Set,Prefixes,在我为x86 arch编写linux专用的小型反汇编程序的过程中,我遇到了一个小问题。它是关于强制前缀和重复前缀的。看看英特尔文档[1],据说重复前缀是0xf2或0xf3,强制前缀是0x66,0xf2或0xf3 有两条指令具有以下基本操作码: crc32--F20f 38 f0(这里,0xf2是一个强制前缀) movbe--0f 38 f0 因此,只要计数器寄存器不为零,就必须重复的“movbe”指令的操作码应为: repnz movbe==f2 0f 38 f0 当我开始反汇编指令时,如果我看

在我为x86 arch编写linux专用的小型反汇编程序的过程中,我遇到了一个小问题。它是关于强制前缀和重复前缀的。看看英特尔文档[1],据说重复前缀是0xf20xf3,强制前缀是0x660xf20xf3

有两条指令具有以下基本操作码:

crc32--F20f 38 f0(这里,0xf2是一个强制前缀)
movbe--0f 38 f0

因此,只要计数器寄存器不为零,就必须重复的“movbe”指令的操作码应为:

repnz movbe==f2 0f 38 f0

当我开始反汇编指令时,如果我看到字节0xf2,我如何知道它是crc32指令的强制前缀,而不是movbe指令的重复前缀,反之亦然?我应该将操作码模式与哪个指令相匹配

我错过了什么

[1]

感谢和问候,

Hrishikesh Murali

您只能在字符串指令中使用重复前缀(请参阅手册)。“f2 0f 38 f0”始终是CRC32指令。

不是可通过
代表((N)E)
前缀重复的指令

只有
字符串指令
可以这样重复。这些是:
MOV*
LOD*
STOS*
SCAS*
CMP*
INS*
OUTS*
,其中
*
B
D
Q
(除了INS*和OUTS*,这两个字最多只能是双字,而不是四字)


对于
rep
/
rep(n)e
说明了这一点。

哦,好的。因此,我必须在我的反汇编程序中进行特殊检查,以获取字符串指令。谢谢,我不知道这一点。+1“REPNE/REPNZ前缀使用F2H编码。重复非零前缀仅适用于字符串和输入/输出指令。”(摘自第2A卷2.1.1)@HrishikeshMurali:yep,注意66h通常是操作数大小前缀,所以你也要做一个类似的检查。@Alex:更好的方法是下面Karel Lejska提到的。最好在我遇到主操作码后计算前缀,这样会使事情变得更简单。@HrishikeshMurali:没错。事实上,这正是我不久前所做的。是的,我错过了。谢谢!:-)使用惰性评估:不要试图立即假定前缀的含义,只需将其存储为原始前缀(即,只需记住“我有0xF2前缀”,而不是“我有REPNE前缀,可能也是强制前缀”)。一旦你有了主操作码,你就有了上下文,你就可以用正确的方法解码前缀。是的,听起来是一种处理前缀的简单方法。感谢您的提示。对于x86反汇编程序而言,随附的反汇编程序相当可读。它使用@Karel建议的方法来处理前缀。