【问题标题】:Assembly: do MOV or DEC influence zero flag?装配:MOV 或 DEC 是否影响零标志?
【发布时间】:2015-08-16 04:01:11
【问题描述】:

在反汇编代码中:

movsx eax,[address1]
# a few fpu computations
dec eax
# so many fpu computations
jz label2

如果 fpu 计算不影响零标志,那么我们可以假设它等于:

# a few fpu computations
# so many fpu computations
movsx eax,[address1]
dec eax
jz label2

那么,我的问题是mov或dec对零标志有影响吗?

【问题讨论】:

  • 您是否在Intel's manual 中查找过MOV 和DEC?它说了什么?
  • @Michael,多本大书。我不知道该读哪一本。大会有没有维基页面?
  • @barej 第 2 卷,第 3 章(上午)
  • 我最近更新了 x86 标签 wiki。它在该英特尔链接的描述中提到了指令集参考手册。英特尔的手册中包含伪代码和文本(以及需要的图表),用于显示机器状态准确发生的每条指令。

标签: assembly x86 disassembly


【解决方案1】:

当然,您应该在手册中查看这一点,但这里有一个通用规则:

  • 移动内容的指令不会修改标志。
  • 进行计算的指令将修改标志。

所以movsx属于第一类,不会改变任何标志。
但是dec 显然会进行计算,并且肯定会更改包括 ZeroFlag 在内的几个标志。

【讨论】:

  • 自 8086 以来 x86 的基本 ALU 指令中有 2 个值得注意的例外:not 不会触及标志。 (与 neg 不同,它相当于从 0 开始的 sub。)lea 也不会触及标志。同样值得注意的是,并非所有指令都会更新 every 标志。 inc/dec 保持 CF 不变。
【解决方案2】:
  • 检查您的假设。

    如果 fpu 计算不影响零标志,那么我们可以假设它等于:

    1. 存在 4 条直接修改 EFLAGS 寄存器的 fpu 指令。它们是fcomi、fcomip、fucomi 和 fucomip。它们定义了 ZF、PF 和 CF。
      您必须仔细阅读 # so many fpu computings(2) 代码块来了解其中的任何一个。如果存在jz label2 将不会基于dec eax 的结果!

    2. 存在 2 个修改 AX 寄存器的 fpu 指令。它们是fstsw ax 和fnstsw ax。
      对于其中任何一个,您都必须仔细阅读 # a few fpu 计算(1) 和 # so many fpu 计算(2) 代码块。如果存在,EAX 将不包含您期望的值!

  • 要回答您关于 mov 和 dec 对 ZF 有任何影响的问题,@user3144770 提供的一般规则几乎说明了一切。

    英特尔手册是处理这些问题的可靠朋友。

【讨论】:

    猜你喜欢
    • 2012-11-06
    • 1970-01-01
    • 2019-01-10
    • 2012-11-14
    • 2016-06-30
    • 1970-01-01
    • 2020-02-03
    • 2016-09-07
    相关资源
    最近更新 更多