gpt4 book ai didi

assembly - 在x86中 "test eax,eax"和 "cmp eax,0"有什么区别

转载 作者:行者123 更新时间:2023-12-02 14:01:18 26 4
gpt4 key购买 nike

test eax, eax 是否比 cmp eax, 0 更高效?是否存在需要 test eax, eaxcmp eax, 0 不满足要求的情况?

最佳答案

正如臧明杰在评论中已经说过的,test eax, eax 几乎与 cmp eax, 0 相同,只是它比 cmp 短,因为使用 cmp 您必须提供 0 作为参数。请注意,节省的空间并不是很大,因为第二个操作数经过符号扩展以匹配第一个操作数的大小,因此不一定需要整个 4 个字节来表示该零。

现在,您要问的是是否还有其他差异。这是一个合理的问题,因为 cmp 是一个算术运算,(它执行减法并丢弃结果),而 test 是一个逻辑运算,(它执行按位与并丢弃结果,)因此人们有理由怀疑他们可能会以不同的方式修改 Flags 寄存器。

事实证明,这两条指令以几乎相同的方式修改Flags寄存器。两条指令都会修改标志寄存器的 OF SF ZF AF PF 和 CF 位。 test 指令总是清除 OF 和 CF,但这也是 cmp 对零所做的事情。唯一的其他区别是 cmp 指令将正确设置 the obscure AF flag ,而 test 指令则将该标志的内容保留为未定义。但对于cmp eax,0,无论eax的值如何,AF都将始终被清除,因此您无法从cmp中学到任何东西eax, 0,您不会从测试 eax, eax 中得知。

因此,我得出的结论是,在任何情况下,test eax, eax 都会为您提供 cmp eax, 0 不会提供的信息,反之亦然。除了保存一两个字节的指令代码之外,这两条指令似乎可以完全互换用于任何实际甚至不那么实际的目的。

使用 test eax, eax 而不是 cmp eax, 0 表明您知道您的程序集。它还表明,与简单易懂的指令相比,您更喜欢稍微隐晦且性能稍微好一点的指令。这种东西往往会从其他极客那里获得奖励积分,但在过去几十年左右的时间里,它在现实世界中并没有任何实际用处。

关于assembly - 在x86中 "test eax,eax"和 "cmp eax,0"有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39556649/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com