装配零和相等之间的差异

时间:2014-06-15 17:14:09

标签: assembly x86 comparison instructions

我是广大的集会世界的初学者,在学习的过程中,我遇到了一个奇怪的事情。

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

还有一些其他说明似乎也是一样的:

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

2 个答案:

答案 0 :(得分:6)

没有区别。对于完全相同的事情,他们只是两个名字。看看它们是如何编码的 - 它是完全相同的字节序列,因此CPU(或反汇编程序)无法知道你写的是哪一个,所以它不能基于以下方式采取不同的行动你用过哪一个。

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

答案 1 :(得分:1)

两个相等的数字在相互减去时给出零。比较基本上只是从另一个操作数减去一个操作数,而不保持差异作为结果。因此,使用“比较”测试操作的结果是否为零,或者两个操作数是否具有相同的值,实际上是相同的操作。