assembly - 汇编零和等于之间的区别

标签 assembly x86 comparison instructions

在广阔的汇编世界中,我是一个完全的初学者,在学习过程中我遇到了一个奇怪的现象。

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

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

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

最佳答案

没有什么区别。它们只是完全相同事物的两个名称。看看它们是如何编码的 - 它是完全相同的字节序列,因此 CPU(或反汇编器)无法知道您编写的是哪一个,因此它不能根据您使用的字节序列而采取不同的行为。

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

关于assembly - 汇编零和等于之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24232102/

相关文章:

c - 如何将存储在数组中的字符串与 c 中完整库中的函数名称进行比较

assembly - 为什么 FMA _mm256_fmadd_pd() 内在函数有 3 个 asm 助记符, "vfmadd132pd"、 "231"和 "213"?

assembly - SPARC - 无移位的位掩码

c - 终端顶行未按预期清除

assembly - x86跳转到某个地址

php - Ruby 迷在字符串中寻找 PHP 子表达式

assembly - Windows 程序集怀疑 - x86

assembly - 实模式,中断向量替换崩溃

assembly - 汇编器64b师

c - 如何在不使用计数器的情况下检查数组的元素是否都相同?