如果没有cmp,je如何工作?

ran*_*ser 5 64-bit assembly

.L10:
    leal    (%rsi,%rsi,4), %edx
    movsbl  %al,%eax
    addq    $1, %rdi
    leal    -48(%rax,%rdx,2), %esi
    je  .L3
Run Code Online (Sandbox Code Playgroud)

在上面只有cmp前面je,它在这里如何工作?

pho*_*xis 10

  • je会跳的是ZF = 1.
  • add修改ZF.
  • lea,movsb不会影响任何标志.

保持英特尔64和IA32体系结构开发手册在手.您可以在手册第2卷中找到Intel 64和IA32架构的所有指令详细信息

  • 当加法结果变为0时,ZF变为1 (2认同)

phi*_*hag 5

je如果在 EFLAGS 寄存器中设置了 ZF 标志,则跳转。ZF 标志的值由cmp修改它的前一个(例如)操作设置。

由于既不修改 ZF 标志,lea也不movsbl修改 ZF 标志add(比较英特尔开发人员手册,3-36),je跳转到.L3iff$1 + %rdi为零。