在x86中重复前缀和必需前缀

时间:2011-11-17 06:30:50

标签: x86 opcode instruction-set prefixes

在我为x86 arch编写一个针对linux的小型反汇编程序时,我遇到了一个小问题。这是关于强制性前缀和重复前缀。看看英特尔文档[1],据说重复前缀是 0xf2 0xf3 ,强制性前缀是 0x66 0xf2 0xf3

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

  

crc32 - f2 0f 38 f0(此处,0xf2是强制性前缀
   movbe - 0f 38 f0

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

  

repnz movbe == f2 0f 38 f0

当我开始反汇编指令时,如果我看到字节 0xf2 ,我怎么知道它是 crc32 的强制性前缀指令但不是 movbe 指令的重复前缀,反之亦然?哪个指令与操作码模式“f2 0f 38 f0”匹配?

我错过了什么?

[1] http://www.intel.com/design/intarch/manuals/243191.HTM

谢谢和问候,
Hrishikesh Murali

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

MOVBE, (move to/from big-endian in memory),不是可通过REP((N)E)前缀重复的指令。

只有string instructions可重复。它们是:MOVS*LODS*STOS*SCAS*CMPS*INS*OUTS*,其中{{1} }是*BWD(INS *和OUTS *除外,它们只会出现双字,而不是四字)。

Q / rep

Intel's manual entry解释了这一点。