我是x86汇编程序新手,很难正确解释所有的条件跳转和测试。我有这样的代码:
sbb dx, dx
test dx, dx
jg short loc_17C7这就是我阅读代码的方式:在sbb之前,CF要么被设置,要么没有设置,所以sbb dx, dx的结果是您在dx中有-1或0。
但是,test dx, dx永远不能导致任何使jg跳转的标志组合。维基百科说
测试操作将标志CF和OF设置为零。SF设置为AND的结果的MSB。如果AND的结果为0,则ZF设置为1,否则设置为0。
如果dx是-1,那将导致OF=0 SF=1 ZF=0 (-1应该是二进制的所有1s,所以MSB必须是1,因此SF=1)。
如果dx为0,则会导致OF=0 SF=0 ZF=1
但jg只跳当且仅当ZF=0 and SF=OF。在案例1中,SF!=OF。在案例2中,ZF!=0。
我在这里错过了什么?
发布于 2013-04-25 22:20:35
你什么都没错过。
这段代码可能是由非优化编译器(至少在本例中)生成的。
sbb在这里根本不重要:
test dx, dx
jg short loc_17C7显然,一个值绝不能超过它本身。
https://stackoverflow.com/questions/16225425
复制相似问题