在调用jnz之前,为什么要与自身进行OR值?

时间:2014-04-29 18:22:05

标签: x86

我正在阅读一些执行以下操作的代码:

OR al, al
JNZ loc_123456

如果我正确读取这个,OR命令只设置一个标志位,然后测试该寄存器没有任何非零值。

为什么要这样写,而不是

CMP al, 0
JNE loc_123456

哪个更具可读性?我假设硬件在每种情况下都做了类似的事情......

2 个答案:

答案 0 :(得分:4)

正如您所述,执行OR操作会设置状态标志,您可以使用以下JNZ(Jump if Not Zero)条件分支进行测试。

许多具有隐式寄存器寻址的处理器上的OR操作码(虽然不在x86上)可以编码为单个操作码。

使用CMP al,0采用操作码加上使用额外的内存作为立即参数。所以它基本上只是为了节省一点内存并可能获得一点速度。

当记忆稀缺时,这些是早期汇编语言发展的常见做法。但这些做法甚至延续至今。

答案 1 :(得分:2)

使用or x, x测试零是一个常见的习惯用法,因此它非常易读。

你应该更喜欢test x, x(也是一个常见的习语),它与许多处理器上的分支进行宏观融合。

避免使用cmp reg, 0。拥有大量的记忆是没有理由浪费它,这里没有任何好处。即使存在可读性差异 - 这是装配,可读性也不重要。缓存空间和指令获取带宽仍然是有限的资源。