2

我是 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

那么我在这里错过了什么?

4

1 回答 1

1

你没有错过任何东西。

此代码可能是由非优化(至少在这种情况下)编译器生成的。

sbb 在这里甚至无关紧要:

 test    dx, dx
 jg      short loc_17C7

显然,一个值永远不会大于它自己。

于 2013-04-25T22:20:35.643 回答