我正在阅读一些执行以下操作的代码:
OR al, al
JNZ loc_123456
如果我正确读取这个,OR
命令只设置一个标志位,然后测试该寄存器没有任何非零值。
为什么要这样写,而不是
CMP al, 0
JNE loc_123456
哪个更具可读性?我假设硬件在每种情况下都做了类似的事情......
答案 0 :(得分:4)
正如您所述,执行OR操作会设置状态标志,您可以使用以下JNZ(Jump if Not Zero)条件分支进行测试。
许多具有隐式寄存器寻址的处理器上的OR操作码(虽然不在x86上)可以编码为单个操作码。
使用CMP al,0采用操作码加上使用额外的内存作为立即参数。所以它基本上只是为了节省一点内存并可能获得一点速度。
当记忆稀缺时,这些是早期汇编语言发展的常见做法。但这些做法甚至延续至今。
答案 1 :(得分:2)
使用or x, x
测试零是一个常见的习惯用法,因此它非常易读。
你应该更喜欢test x, x
(也是一个常见的习语),它与许多处理器上的分支进行宏观融合。
避免使用cmp reg, 0
。拥有大量的记忆是没有理由浪费它,这里没有任何好处。即使存在可读性差异 - 这是装配,可读性也不重要。缓存空间和指令获取带宽仍然是有限的资源。