【问题标题】:Repeat prefixes and mandatory prefixes in x86x86 中的重复前缀和强制前缀
【发布时间】:2011-12-31 01:43:35
【问题描述】:

在我为 x86 架构编写一个针对 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

感谢和问候,
赫里希凯什·穆拉利

【问题讨论】:

  • 就 x86 反汇编程序而言,qemu 包含的反汇编程序是相当可读的。它使用@Karel 建议的方法来处理前缀。

标签: x86 opcode instruction-set prefixes


【解决方案1】:

您只能在字符串指令中使用重复前缀(参见手册)。 "f2 0f 38 f0" 总是 CRC32 指令。

【讨论】:

  • 是的,我错过了。谢谢! :-)
  • 使用惰性求值:不要试图立即假设前缀的含义,只需将其存储为原始前缀(即只记住“我有 0xF2 前缀”而不是“我有REPNE 前缀也可能是强制性前缀”)。获得主操作码后,您就获得了上下文,并且可以正确解码前缀。
  • 是的,听起来像是一种处理前缀的简单方法。感谢您的提示。
【解决方案2】:

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

只有string instructions 可以这样重复。它们是:MOVS*、LODS*、STOS*、SCAS*、CMPS*、INS*、OUTS*,其中* 是B 或W36@3 中的任一个, Q(除了 INS* 和 OUTS*,它们只能上升到双字,而不是四字)。

Intel's manual entry for rep/rep(n)e 解释了这一点。

【讨论】:

  • 哦,好的。所以我必须在我的反汇编程序中对字符串指令进行特殊检查。谢谢,我不知道这个。
  • +1 "REPNE/REPNZ 前缀使用 F2H 编码。Repeat-Not-Zero 前缀仅适用于字符串和输入/输出指令。" (来自第 2A 卷 2.1.1)
  • @HrishikeshMurali:是的,请注意 66h 通常是操作数大小的前缀,因此您也必须在那里进行类似的检查。
  • @Alex:下面的 Karel Lejska 会提到更好的方法。遇到主操作码后最好评估前缀,这样会更容易。
  • @HrishikeshMurali:没错。事实上,这正是我前段时间所做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 2017-09-01
  • 2017-07-13
  • 2012-10-03
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
相关资源
最近更新 更多