我一直在用头撞墙来解决这个问题,但这对我来说毫无意义......
为什么这个程序会进入死循环?!
我以为你可以用test
比较两个值是否相等,如图所示here https://stackoverflow.com/questions/6002079...为什么不起作用?
int main()
{
__asm
{
mov EAX, 1;
mov EDX, EAX;
test EAX, EDX;
L: jne L;
}
}
您对什么的期望TEST
指令确实不正确。
该指令用于执行位测试。您通常会使用它来“测试”是否在给定掩码的情况下设置了某些位。它将与JZ
(如果为零则跳转)或JNZ
(如果不为零则跳转)指令。
该测试涉及对两个操作数执行按位与并设置适当的标志(丢弃结果)。如果掩码中没有相应位被设置,则 ZF(零标志)将被设置1
(所有位均为零)。如果您想测试是否已设置,您可以使用JNZ
操作说明。如果你想测试是否没有设置,你可以使用JZ
操作说明。
The JE
and JNE
不适合此指令,因为它们对标志的解释不同。
您正在尝试对某些变量执行相等检查。您应该使用CMP
操作说明。您通常会使用它来相互比较值。
该比较有效地减去操作数并仅设置标志(丢弃结果)。当相等时,两个值的差为0
(ZF = 1)。当不相等时,两个值的差值不为零 (ZF = 0)。如果你想测试它们是否相等,你可以使用JE
(如果相等则跳转)指令。如果你想测试它们是否不相等,你可以使用JNE
(不等于则跳转)指令。
在这种情况下,由于您使用了TEST
,由此产生的标志将产生ZF = 0
(0x1 & 0x1 = 0x1,非零)。自从ZF = 0
, the JNE
指令将采用您在这里看到的分支。
tl;dr
您需要使用以下方法比较这些值CMP
如果您正在检查是否相等,则说明不是TEST
them.
int main()
{
__asm
{
mov EAX, 1
mov EDX, EAX
cmp EAX, EDX
L: jne L ; no more infinite loop
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)