我是x86汇编程序的新手,很难正确解释所有条件跳转和测试。我有这段代码:
sbb dx, dx
test dx, dx
jg short loc_17C7
这就是我阅读该代码的方式:在sbb
之前,CF
已设置或未设置,因此sbb dx, dx
的结果是{或1}中的-1或0 {1}}。
但是dx
永远不会导致任何使test dx, dx
跳跃的FLAGS组合。维基百科说
TEST操作将标志CF和OF设置为零。 SF设置为AND结果的MSB。如果AND的结果为0,则ZF设置为1,否则设置为0.
如果jg
为-1,那将导致dx
(-1应为二进制的全1,因此MSB必须为1,因此SF = 1)
如果OF=0 SF=1 ZF=0
为0,则会导致dx
但OF=0 SF=0 ZF=1
只会跳转iff jg
。在案例1中,ZF=0 and SF=OF
。在案例2中,SF!=OF
。
那我在这里错过了什么?
答案 0 :(得分:1)
你没有遗漏任何东西。
此代码可能是由非优化(至少在本例中)编译器生成的。
sbb在这里甚至不重要:
test dx, dx
jg short loc_17C7
显然,价值永远不会超过自身。