【问题标题】:Understanding cmp instruction理解 cmp 指令
【发布时间】:2022-02-09 14:18:18
【问题描述】:

我对组装很陌生,现在我正试图了解cmp 的工作原理。这是wiki中写的内容:

cmp arg2, arg1

在 arg1 和 arg2 之间执行比较操作。比较 通过从 arg1 中减去 arg2 来执行(有符号),结果 其中可以称为Temp。 Temp 然后被丢弃

“Temp is then discarded”是什么意思?它存储在哪里?如何访问此比较结果?谁能解释一下?

【问题讨论】:

  • @Carcigenicate *ax?因为 AFAIK,它经常与 je 一起使用。但是 je 需要知道条件是真还是假。
  • 请注意,您指的是 wikibooks,它是 wikis 的特定集合。 wiki 只是一种用户可以编辑的网站。因此,wikibooks 绝对不是 x86 程序集定义的主要资源(这是一个很好的例子,为什么有时依赖专家文档而不是用户生成的文档更好)。使用谷歌寻找另一个来源,并解释它!
  • je 不需要知道条件是真还是假,jejz 的别名,jz 是“如果设置了零标志则跳转”。因此,无论最后一条指令是否修改了 ZF,该指令都会预测下一个 je 是否会跳转(ZF=1)或不跳转(ZF=0)。新的 asm 程序员没有得到它的有趣后果之一是编写像 sub ax,1 cmp ax,0 jne myLoop ... 这样的代码,那里不需要 cmp,因为之前的 sub 已经将 ZF 设置为足够的jne 工作的方式(但更合乎逻辑的是使用 jnz myLoop 别名,即读作“跳转非零循环” - 几乎是英语。
  • “比较是通过(有符号的)减法执行的”——用 2 的补数进行减法既不是有符号的也不是无符号的,两者都是完全相同的操作。 jz/jejnz/jne 也不关心比较是有符号还是无符号。但是,其他 x86 比较条件分支确实需要指定为有符号或无符号。有符号的称为“jump if (not) less/less-or-equal/greater/greater-or-equal”,给出指令jljg 等。无符号比较条件称为“jump if (not) ) 下方/上方/等”、jbja

标签: assembly x86 comparison


【解决方案1】:

cmp arg2, arg1 执行与sub arg2, arg1 相同的操作除了没有任何操作数被修改。差异不会存储在任何地方

但是,标志寄存器 已更新,可用于条件跳转,例如 jump-if-equal (JE),通常用作cmp 之后的下一条指令。

与其他指令相比,优势在于您可以比较两个值而不会破坏它们中的任何一个。如果你做了sub arg2, arg1 并且它们恰好相等,那么其中一个之后将为零。 cmp 他们都还在。

【讨论】:

    【解决方案2】:

    CMP的结果是改变ZF和CF的值,这是一些非常理解CMP指令的例子。

    示例 1:如果 AX

    MOV AX,5
    MOV BX,8
    CMP AX,BX 
    

    结果:ZF 和 CF 设置为 ==> "ZF = 0" 和 "CF = 1"



    示例 2:如果 AX > BX

    MOV AX,8
    MOV BX,5
    CMP AX,BX
    

    结果:ZF 和 CF 设置为 ==> "ZF = 0" 和 "CF = 0"



    示例 3:如果 AX = BX

    MOV AX,5
    MOV BX,AX
    CMP AX,BX 
    

    结果:ZF 和 CF 设置为 ==> "ZF = 1" 和 "CF = 0"



    我希望您了解 CMP 的结果正在改变 ZF 和 CF 的值
    ZF = 零标志
    CF = 进位标志

    【讨论】:

      【解决方案3】:

      当我们关心 arg1 和 arg 2 是否相等时,我们使用cmp arg2, arg1。处理器通过从 arg1 中减去 arg2 来确定这一点,然后查看结果。如果结果为零(即 arg1 = arg2),则处理器设置零标志(通过“设置标志”,我们的意思是将其设置为 1)。相反,如果结果不为零(即 arg1 != arg2),则处理器清除零标志(即,将其设置为 0)。结果本身被丢弃,因为我们不关心它是什么,只关心它是否为零,我们现在根据是否设置了零标志来知道它。然后,我们可以使用诸如JEJNEJZJNZ 之类的指令来检查零标志并根据其值跳转(或不跳转)。在JE 的情况下(如果相等则跳转),如果设置了零标志,则跳转将发生,(正如我们在上面了解到的)如果cmp 中的参数相等,则会发生跳转。

      【讨论】:

        【解决方案4】:

        我认为现在发布这个问题的答案为时已晚。但我可以更好地说明这个 CMP 指令的工作原理。

        当您使用 CMP arg1, arg2 比较两个参数时

        CMP 指令根据参数之间的比较设置状态标志。 见:wikipedia's FLAGS page

        CMP 的重要性主要适用于条件代码执行(跳转 - 请参阅:assembly_conditions)。当处理器执行条件跳转jcc指令时,它会检查状态标志寄存器,如果满足条件则跳转到目标标签,否则跳转到下一条指令。

        【讨论】:

          猜你喜欢
          • 2014-06-15
          • 1970-01-01
          • 1970-01-01
          • 2021-03-08
          • 1970-01-01
          • 1970-01-01
          • 2012-01-12
          • 1970-01-01
          • 2012-12-29
          相关资源
          最近更新 更多