3

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

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

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

4

2 回答 2

4

您只能将重复前缀与字符串指令一起使用(参见手册)。“f2 0f 38 f0”始终是 CRC32 指令。

于 2011-11-17T06:49:28.847 回答
2

MOVBE,(在内存中移入/移出大端),不是可通过REP((N)E)前缀重复的指令。

只能string instructions以这种方式重复。它们是:MOVS*, LODS*, STOS*, SCAS*, CMPS*, INS*, OUTS*, 其中*一个是B, W,DQ(除了 INS* 和 OUTS*,它们只能上升到双字,而不是四字)。

英特尔的手动输入/rep解释rep(n)e了这一点。

于 2011-11-17T06:53:23.813 回答