在广阔的汇编世界中,我是一个完全的初学者,在学习过程中我遇到了一个奇怪的现象。
条件跳转是在标志检查的基础上完成的,以查看某些运算符如何进行比较。但是,似乎有两种不同的方法可以进行检查。对于几乎每条条件跳转指令,似乎都有一个对应的指令可以执行完全相同的操作,只是使用不同的符号。例如,je
看起来与 jz
相同。据我所知,如果指令之前的两个操作数的比较设置零标志,这两个指令都会跳转。这里的说明有什么区别。其中一个比另一个更有效率吗?会产生更多开销吗?区分只是为了可读性吗?
还有一些其他指令似乎也相同:
loopz
/loope
jb
/jc
jnz
/jne
最佳答案
没有什么区别。它们只是完全相同事物的两个名称。看看它们是如何编码的 - 它是完全相同的字节序列,因此 CPU(或反汇编器)无法知道您编写的是哪一个,因此它不能根据您使用的字节序列而采取不同的行为。
这样您就可以让其他程序员的意图更加明显,例如,如果您实际上检查了零(使用 test
),则可以使用 z
变体> 也许)但是如果您只是比较两个事物,则可能是 e
变体。
关于assembly - 汇编零和等于之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24232102/