我一直在用头撞墙来解决这个问题,这对我来说毫无意义......
为什么这个程序会进入死循环?!
我认为您可以使用 test
来比较两个值是否相等,如图所示 here ...为什么不起作用?
int main()
{
__asm
{
mov EAX, 1;
mov EDX, EAX;
test EAX, EDX;
L: jne L;
}
}
最佳答案
您对 TEST
指令的预期不正确。
该指令用于进行位测试。您通常会使用它来“测试”是否在给定掩码的情况下设置了某些位。它将与 JZ
(如果为零则跳转)或 JNZ
(如果不为零则跳转)指令结合使用。
测试涉及对两个操作数执行按位与并设置适当的标志(丢弃结果)。如果掩码中的相应位均未设置,则 ZF(零标志)将为 1
(所有位均为零)。如果您想测试是否设置了任何内容,可以使用 JNZ
指令。如果你想测试是否没有设置,你可以使用 JZ
指令。
JE
和 JNE
不适用于此指令,因为它们对标志的解释不同。
您正在尝试对某些变量执行等式检查。您应该使用 CMP
指令。您通常会使用它来相互比较值。
比较有效地减去操作数并且只设置标志(丢弃结果)。当相等时,两个值的差为 0
(ZF = 1)。当不相等时,两个值的差不为零 (ZF = 0)。如果您想测试它们是否相等,您可以使用 JE
(如果相等则跳转)指令。如果您想测试它们是否不相等,您可以使用 JNE
(如果不相等则跳转)指令。
在这种情况下,由于您使用了 TEST
,生成的标志将产生 ZF = 0
(0x1 & 0x1 = 0x1,非零)。由于 ZF = 0
,JNE
指令将采用您在此处看到的分支。
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/