我比较什么?在JNE之前的汇编代码中没有CMP指令

时间:2018-02-13 03:23:37

标签: assembly

在JNE声明之前没有CMP指令时意味着什么?

 0x0000000000401114 <+64>:  add    %eax,%ecx
   0x0000000000401116 <+66>:    cltq   
   0x0000000000401118 <+68>:    mov    0x4026e0(,%rax,4),%eax
   0x000000000040111f <+75>:    sub    $0x1,%edx
   0x0000000000401122 <+78>:    jne    0x401114 <phase_5+64>

我在比较什么?

3 个答案:

答案 0 :(得分:2)

cmp edx, 1更改标记与sub edx, 1完全相同,只是它不会更新edx。这意味着您无需在循环中执行cmpsub,而只需执行sub

答案 1 :(得分:1)

如果ZF(零标志)为零,

JNE指令用于测试和跳转

如果$ 0x1和%edx相等,

SUB指令会将ZF标志设置为1,否则为0

答案 2 :(得分:1)

SUB(与大多数x86整数指令一样)根据结果设置标志,即如果EDX变为零,则设置ZF。

你的反汇编程序将助记符显示为JNE,但JNZ同义词有the more appropriate semantic meaning here,因为你真的更关心在SUB之后EDX变为零。

更容易将其视为与1的比较,而不是将其作为的底部 do {} while(--edx); loop