当前位置: 首页 > 知识库问答 >
问题:

在 x86 中,“测试电子,电子烟”和“cmp 电子烟,0”之间的区别是什么

顾斌
2023-03-14

测试eax,eax是否比cmp-eax,0更高效?在cmp-eax,0不满足要求的情况下,是否需要测试eax,eax?


共有2个答案

宰父俊民
2023-03-14

#差异(理论)

如上评论和公认答案所述,这些指令在以这种方式使用时几乎是相同的,但为什么指令集中有两条指令是相同的呢?

因为如果使用不同的操作数,它们是不同的。事实上,< code>test same,same作为与零的比较,这只是2的补码和标志工作方式的一个方便的结果,使它成为一个有用的窥视孔优化。

TEST指令在arg0和arg1的位对上使用AND逻辑,可以检查是否设置了特定位,然后相应地设置了FLAGS。(整数结果被丢弃)。就像cmp从减法中设置FLAGS,同时丢弃整数结果一样。

#操作(测试)

HTML(英特尔第 2 卷 PDF 手册除外)

TEMP ← SRC1 **AND** SRC2;
SF ← MSB(TEMP);
IF TEMP=0
    THEN ZF ← 1;
    ELSE ZF ← 0;
FI:

PF ← BitwiseXNOR(TEMP[0:7]);
CF ← 0;
OF ← 0;
(* AF is undefined *)

受影响的标志

OF 和 CF 标志设置为 0。SF、ZF 和 PF 标志是根据结果设置的(请参阅上面的“操作”部分)。AF 标志的状态未定义。

(TEST操作将标志CF和OF设置为零。SF设置为and结果的最高有效位。如果结果为0,则ZF设置为1,否则设置为0。)

虽然 CMP 指令使用 SUB 指令并从 arg0 中减去 arg1,并将根据给定的参数设置 CF(携带标志)和 ZF(零标志),但如果两者都相等 (arg1==arg0),那么很明显,结果将为零,ZF 将设置为 1,如果 arg0

#操作(CMP)

temp ← SRC1 − SignExtend(SRC2); 
ModifyStatusFlags; 
   (* Modify status flags in  the same manner as the SUB instruction*)

受影响的标志

CF、OF、SF、ZF、AF和PF标志根据结果进行设置。

仉昂熙
2023-03-14
匿名用户

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

现在,你问的是有没有其他的区别。这是一个合理的问题,因为< code>cmp是一个算术运算,(它执行减法并丢弃结果),而< code>test是一个html" target="_blank">逻辑运算,(它执行按位and并丢弃结果),所以人们有理由怀疑它们可能会以不同的方式修改< code>Flags寄存器。

事实证明,两条指令以几乎相同的方式修改< code>Flags寄存器。两条指令都修改标志寄存器的SF ZF AF PF和CF位。< code>test指令总是清除和CF,但这也是< code>cmp对zero所做的事情。唯一不同的是,< code>cmp指令将正确设置模糊的< code>AF标志,而< code>test指令则不定义该标志的内容。但是在< code>cmp eax,0的情况下,无论< code>eax的值是多少,AF都将被清除,因此,您从< code>cmp eax,0中学不到的东西都不会从< code>test eax,eax中学到。

因此,我的结论是,不存在< code>test eax,eax会提供< code>cmp eax,0不会提供的内容的情况,反之亦然。除了节省一两个字节的指令代码之外,这两条指令似乎完全可以互换,用于任何实际的甚至不太实际的目的。

使用test eax,eax而不是cmp eax,0表明您了解您的程序集。它还表明您更喜欢稍微隐晦、性能略好于简单易懂的指令。这种事情往往会从其他极客那里获得加分,但在过去的几十年里,它在现实世界中没有任何实用的有用性。

 类似资料:
  • 本文向大家介绍什么是冒烟测试?相关面试题,主要包含被问及什么是冒烟测试?时的应答技巧和注意事项,需要的朋友参考一下 确保软件满足系统测试的要求

  • 我是一名编码等方面的初学者,但我正在努力理解我在做什么以及代码中发生了什么。 我想在不同的电子表格之间划一行。 我在“核心”电子表格中有一个脚本,它在“主页”和“完成”表格链接之间移动一行到电子表格: 我搜索了如何将位于“已完成”工作表上的数据移动到另一个名为“数据库”的电子表格链接到电子表格: 但我想将数据从表“CORE”/“Finished”传输到表“database”/“DB”,而不重写DB

  • 所以我决定为我的Woocommerce商店提供两个不同的模板。 我发现了一个很好的小片段,它基本上告诉我编辑taxonomy-product_cat。php 我的所有店铺页面都是分类/归档页面。我父母的分类中,每只有50只猫。 因此,我的代码在taxonomy-product_cat中如下所示。php: 问题是archive-product.php只适用于“户外家具”类别,而不是其子类别。 我知道

  • 我正试图通过WoodPress主题中的一个函数从woocommerce获取产品类别,我已经做到了: 这将按层次列出所有顶级类别及其下的子类别,但我有子类别(子类别)的子类别,因此如何列出这些子类别。

  • 我是谷歌脚本的新手,不知道是否有人能帮我。 我有一个共享的谷歌电子表格,基本上是用新的员工信息更新行。 我希望只有当插入这些新员工行时,特定列(比如F列)上的“ABC”字符串匹配时,才会触发电子邮件。基本上,电子邮件触发器会让我们的团队知道如何设置新的员工帐户。 有人能帮我吗?我不知道如何进行字符串匹配,也不知道如何让它专门发送给固定的电子邮件收件人。我已经安装了Python、gspread和gd

  • 冒烟测试与健全测试比较和区别如下表所示: 编号 冒烟测试 健全测试 1 它是一种测试应用程序所有部分测试位置的广泛方法。 它是一种测试应用程序特定部分的狭隘方法。 2 它通过执行严格的测试来测量系统的稳定性。 它通过执行严格的测试来衡量系统的合理性。 3 烟雾测试可以手动或自动进行。 可以在没有测试用例或脚本的情况下完成健全性测试。 4 它由测试人员和开发人员执行。 它仅由测试人员执行。 5 测试