2013-04-25 92 views
1

我是新來的x86彙編程序,很難正確解釋所有條件跳轉和測試。我有這樣的代碼:裝配-TEST dx,dx後面跟着jg

sbb  dx, dx 
test dx, dx 
jg  short loc_17C7 

這是我讀到代碼:sbb之前,CF被設置或沒有,所以sbb dx, dx的結果是,你要麼-1或dx 0。

但是然後test dx, dx永遠不會導致將使jg跳躍的標誌的任何組合。維基百科說

測試操作將標誌CF和OF設置爲零。 SF被設置爲AND的結果的MSB。如果的,結果是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僅當且僅當跳躍ZF=0 and SF=OF。在案例1中,SF!=OF。在情況2下,ZF!=0

那麼我在這裏錯過了什麼?

+0

我相信你的結論是正確的。 'JGE'會有道理; 'JZ'會有意義。 'JC'而不是全部三條指令可能會更有意義(或者這些指令的反向 - 無意推測代碼無法工作) - 沒有明顯的方法來達到'jg'之後的指令 - 除非它是也許標籤爲''loc_17c7'? – Magoo 2013-04-26 05:18:23

回答

1

你不會錯過任何東西。

此代碼可能是由非優化(至少在本例中)編譯器生成的。

SBB的甚至沒有事在這裏:

test dx, dx 
jg  short loc_17C7 

顯然,一個值不能比自己更大。

+2

sbb是否重要 - 如果不存在,'dx'中的值可能不是0或-1;如果該分支爲非零值,則該分支將被採用。 – 2013-04-25 22:35:58

+0

@ChrisDodd(&Simon):我的壞 - 我把'test'與'cmp'混合在一起。後者設置標誌與「sub」相同,但保留該值。 '測試'OTOH與'和'相同,但保留價值。 – 2013-04-25 22:51:03