gpt4 book ai didi

assembly - 测试点 %eax %eax

转载 作者:行者123 更新时间:2023-12-03 04:32:56 25 4
gpt4 key购买 nike

Possible Duplicate:
x86 Assembly - ‘testl’ eax against eax?

我对汇编语言编程非常陌生,我目前正在尝试读取从二进制文件生成的汇编语言。我遇到过

 test   %eax,%eax

test %rdi, %rdi等等。我对它的作用感到非常困惑。 %eax, %eax中的值不是吗?相同?它在测试什么?我在某处读到它正在执行 AND操作......但由于它们是相同的值,不是只返回 %eax

以下只是我发现此用法的一个实例:

   400e6e:       85 c0                   test   %eax,%eax
400e70: 74 05 je 400e77 <phase_1+0x23>

我以为je如果比较的两个值相等则跳转......好吧,因为 %eax本身很好,在什么情况下我们不会跳?

总的来说,我是编程的初学者,所以如果有人能向我解释这一点,我将非常感激。谢谢!

最佳答案

CMP 减去操作数并设置标志。也就是说,如果差值为零(操作数相等),它将设置零标志。

当 AND 运算的结果为零时,

TEST 设置零标志 ZF。如果两个操作数相等,则当两者都为零时,它们的按位与为零。当在结果中设置最高有效位时,TEST 还会设置符号标志 SF,当在结果中设置最高有效位时,还会设置奇偶校验标志 PF。设置位数为偶数。

JE [Jump if Equals] 测试零标志并在设置该标志时跳转。 JEJZ [Jump if Zero] 的别名,因此反汇编器无法根据操作码选择一个。 JE 之所以如此命名,是因为如果 CMP 的参数相等,则设置零标志。

所以,

TEST %eax, %eax
JE 400e77 <phase_1+0x23>

如果 %eax 为零则跳转。

关于assembly - 测试点 %eax %eax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13064809/

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