【问题标题】:Difference between assembly zero and equal组装零和相等之间的区别
【发布时间】:2014-06-15 17:14:08
【问题描述】:

在广阔的装配世界中,我是一个完全的初学者,在学习的过程中我遇到了一个奇怪的事情。

条件跳转是在标志检查的基础上完成的,以查看某些运算符的比较。但是,似乎有两种不同的方法可以进行检查。对于几乎每条条件跳转指令,似乎都有一个对应物执行完全相同的操作,只是符号不同。例如,je 似乎与 jz 相同。据我所知,如果在指令之前比较两个操作数设置零标志,这两条指令都会跳转。这里的说明有什么区别。一个比另一个更有效吗?是否会产生更多开销?区分仅仅是为了可读性吗?

还有一些其他指令似乎也相同:

  • loopz / loope
  • jb / jc
  • jnz / jne

【问题讨论】:

标签: assembly x86 comparison instructions


【解决方案1】:

没有区别。它们只是完全相同事物的两个名称。看看它们是如何编码的——它是完全相同的字节序列,所以 CPU(或反汇编器)无法知道你写的是哪一个,所以它不能根据你使用的哪一个而有所不同。

这样你就可以让其他程序员的意图更加明显,例如,如果你实际上检查为零,则使用z 变体(可能使用test),但如果你使用e 变体你只是比较了两件事。

【讨论】:

    【解决方案2】:

    两个相等的数相减时为零。比较本质上就是从另一个操作数中减去一个操作数,而不会将差异作为结果。因此,使用“比较”来测试一个操作的结果是否为零,或者两个操作数是否具有相同的值,实际上是相同的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      相关资源
      最近更新 更多