我是 x86 汇编程序的新手,很难正确解释所有条件跳转和测试。我有这个代码:
sbb dx, dx
test dx, dx
jg short loc_17C7
这就是我阅读该代码的方式:在sbb
,之前CF
设置或未设置,因此结果sbb dx, dx
是您在dx
.
但是这样test dx, dx
永远不会导致任何可以jg
跳转的 FLAGS 组合。维基百科说
TEST 操作将标志 CF 和 OF 设置为零。SF 设置为 AND 结果的 MSB。如果 AND 的结果为 0,则 ZF 设置为 1,否则设置为 0。
如果dx
是-1,那将导致OF=0 SF=1 ZF=0
(-1在二进制中应该全是1,所以MSB必须是1,因此SF=1)
如果dx
为 0,那将导致OF=0 SF=0 ZF=1
但jg
只跳 iff ZF=0 and SF=OF
。在情况 1 中,SF!=OF
。在情况 2 中,ZF!=0
。
那么我在这里错过了什么?