装配:MOV 或 DEC 会影响零标志吗?

bar*_*rej 4 x86 assembly disassembly

在反汇编代码中:

movsx eax,[address1]
# a few fpu computations
dec eax
# so many fpu computations
jz label2
Run Code Online (Sandbox Code Playgroud)

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

# a few fpu computations
# so many fpu computations
movsx eax,[address1]
dec eax
jz label2
Run Code Online (Sandbox Code Playgroud)

然后,我的问题是,你mov或者dec对零标志是否有影响?

Sep*_*and 11

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

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

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

  • x86 自 8086 以来的基本 ALU 指令中有 2 个值得注意的例外:[`not`](https://www.felixcloutier.com/x86/not) 不触及标志。(与“neg”不同,“neg”相当于从 0 开始的“sub”。)“lea”也不触及标志。另外值得注意的是,并非所有指令都会更新*每个*标志。`inc`/`dec` 使 CF 保持不变。 (2认同)

Fif*_*nik 6

  • 检查你的假设。

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

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

    2. 存在 2 条修改 AX 寄存器的 fpu 指令。这些是fstsw axfnstsw ax
      对于其中的任何一个,您都必须仔细阅读# 几个 fpu 计算(1)# 这么多 fpu 计算(2)代码块。如果存在 EAX 将不包含您期望的值!

  • 要回答您关于ZFmov并对其产生dec任何影响的问题,@user3144770 提供的一般规则几乎说明了一切。

    在这些问题上,英特尔手册是可靠的朋友