gpt4 book ai didi

c - x86 测试指令不起作用?

转载 作者:太空狗 更新时间:2023-10-29 14:54:10 26 4
gpt4 key购买 nike

我一直在用头撞墙来解决这个问题,这对我来说毫无意义......

为什么这个程序会进入死循环?!

我认为您可以使用 test 来比较两个值是否相等,如图所示 here ...为什么不起作用?

int main()
{
__asm
{
mov EAX, 1;
mov EDX, EAX;
test EAX, EDX;
L: jne L;
}
}

最佳答案

您对 TEST 指令的预期不正确。

该指令用于进行位测试。您通常会使用它来“测试”是否在给定掩码的情况下设置了某些位。它将与 JZ(如果为零则跳转)或 JNZ(如果不为零则跳转)指令结合使用。

测试涉及对两个操作数执行按位与并设置适当的标志(丢弃结果)。如果掩码中的相应位均未设置,则 ZF(零标志)将为 1(所有位均为零)。如果您想测试是否设置了任何内容,可以使用 JNZ 指令。如果你想测试是否没有设置,你可以使用 JZ 指令。

JEJNE 不适用于此指令,因为它们对标志的解释不同。


您正在尝试对某些变量执行等式检查。您应该使用 CMP 指令。您通常会使用它来相互比较值。

比较有效地减去操作数并且只设置标志(丢弃结果)。当相等时,两个值的差为 0 (ZF = 1)。当不相等时,两个值的差不为零 (ZF = 0)。如果您想测试它们是否相等,您可以使用 JE(如果相等则跳转)指令。如果您想测试它们是否不相等,您可以使用 JNE(如果不相等则跳转)指令。


在这种情况下,由于您使用了 TEST,生成的标志将产生 ZF = 0(0x1 & 0x1 = 0x1,非零)。由于 ZF = 0JNE 指令将采用您在此处看到的分支。

tl;博士

如果要检查是否相等,则需要使用 CMP 指令比较值,而不是 TEST 它们。

int main()
{
__asm
{
mov EAX, 1
mov EDX, EAX
cmp EAX, EDX
L: jne L ; no more infinite loop
}
}

关于c - x86 测试指令不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15182271/

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