gpt4 book ai didi

assembly - "or eax,eax"和 "test eax,eax"的区别

转载 作者:行者123 更新时间:2023-12-04 07:01:36 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Test whether a register is zero with CMP reg,0 vs OR reg,reg?

(2 个回答)


3年前关闭。



or eax,eax有什么区别和 test eax,eax ?我已经看到不同的编译器为相同的比较而生成,并且就文档而言,它们做的事情完全相同,所以我想知道为什么它们不都使用 test eax,eax .想想and eax,eax会以与两者相同的方式设置标志,但我在 freepascal、delphi 或 msVC++ 中都没有看到它。

我确实在 delphi 中编译了一些 asm 块并检查了汇编源代码,所有 3 种形式的操作码长度都完全相同,还检查了 intel 性能 PDF,它说它们具有相同的延迟和吞吐量。

编辑:
问题具体是具体案例的区别test eax,eax , or eax,eaxand eax,eax .对于寄存器、标志、操作码长度、延迟、吞吐量,所有 3 种方法都给出了完全相同的结果。然而为了测试是否为 0,如果不是零,或者是否有符号,一些编译器将使用 test eax,eax而有些人使用 or eax,eax ,我想知道为什么他们不都使用 test eax,eax因为它使代码更加清晰。

编辑2:
作为引用,我在家里,这里只有较旧的 msvc++ 和 Delphi,但如果变量为零,则 msvc++ 会执行 test eax,eax , 而 Delphi 是 or eax,eax .

最佳答案

一般来说,test之间的唯一区别和 andtest <reg>, <reg>不修改其操作数。本质上test申请 and操作,丢弃结果的非标志部分。如果操作数相同,结果将相同(如 or )。
test由于诸如微操作融合之类的东西,可以成为更好的指令选择。结果,test通常首选,除非必须重复计算。同样的事情也适用于 cmp/sub .

在 Intel 的文档中搜索“fusion”,您应该会找到详细信息。

关于assembly - "or eax,eax"和 "test eax,eax"的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23691989/

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