在我为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
答案 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} }是*
,B
,W
或D
(INS *和OUTS *除外,它们只会出现双字,而不是四字)。
Q
/ rep
的Intel's manual entry解释了这一点。