有一些x86
指令在其语义中包含低级**控制流,例如div,因为其语义大致为:
if (source == 0)
throw exception...
else
return rdx:rax / source
或带有rep
前缀的指令等。而 amov
或 axor
不包含任何控制流。
我试图x86
根据这个标准对ISA 的指令进行分类,我现在的出发点是研究Xed的 API 以了解是否存在可以提供此类信息的某些函数,但它似乎没有。
具体来说div
,我已经检查了xed_decoded_inst_conditionally_writes_registers、xed_operand_conditional_read/write,但它们都返回 false。
** 我很抱歉这个词,我不知道这个案例的确切术语。
编辑:非常感谢您的评论,但我表达了我的问题。我在下面的一些讨论中更新,以使上下文更加清晰。
Xed 的 API 不会提供完整的指令语义,但会提供一些。例如,使用一些固定 API(我在上面描述过)我们可以得到:
mov rax, r8
operands: 2
uses rflag: no
has conditional read operand: no
has conditional write operand: no
conditionally write register: no
和
cmovb rax, r8
operands: 3
uses rflag: yes
has conditional read operand: no
has conditional write operand: yes
conditionally write register: yes
所以至少我知道cmovb
它的语义应该有一些条件控制流,而mov
没有。
我尝试将此逻辑应用于其他指令:它适用于某些(例如rep movsb
,等),但不是全部:
- 对于
div
***(或mov
),恕我直言,说没有条件控制流是“可接受的”*。我们认为异常是副作用:如果抛出异常,则不执行(或仅部分执行)指令 - 对于其他情况,例如
minps
,这种逻辑根本不起作用
*** 我最初认为div
包含条件数据流,但后来改变了:)