Is test eax, eax
比更有效率cmp eax, 0
?是否存在以下情况:test eax, eax
是必要的地方cmp eax, 0
不满足要求?
正如臧明杰在评论中已经说过的,test eax, eax
几乎与cmp eax, 0
,除了它短于cmp
,因为与cmp
你必须提供0
作为一个论点。请注意,节省的空间不是很大,因为第二个操作数经过符号扩展以匹配第一个操作数的大小,因此不一定需要整个 4 个字节来表示该零。
现在,您要问的是是否还有其他差异。这是一个合理的问题,因为cmp
是算术运算(它执行减法并丢弃结果),而test
是一个逻辑运算(它执行按位 AND 并丢弃结果),因此人们有理由怀疑他们可能会修改Flags
注册方式不同。
事实证明,这两条指令都修改了Flags
注册在almost相同的时尚。两条指令都会修改标志寄存器的 OF SF ZF AF PF 和 CF 位。这test
指令总是清除 OF 和 CF,但这也是cmp
反对零。唯一的其他区别是cmp
指令将正确设置晦涩的AF flag https://en.wikipedia.org/wiki/Adjust_flag,而test
指令使该标志的内容未定义。但在这种情况下cmp eax,0
无论 AF 的值是多少,AF 总是会被清除eax
,所以你无法从中学到任何东西cmp eax, 0
你不会从test eax, eax
.
因此,我的结论是,不存在以下情况:test eax, eax
会给你一些东西cmp eax, 0
不会,反之亦然。除了保存一两个字节的指令代码之外,这两条指令似乎可以完全互换用于任何实际甚至不那么实际的目的。
Using test eax, eax
代替cmp eax, 0
表明您了解您的装配。它还表明,与简单易懂的指令相比,您更喜欢稍微隐晦且性能稍微好一点的指令。这种东西往往会从其他极客那里获得奖励积分,但在过去几十年左右的时间里,它在现实世界中并没有任何实际用处。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)