2013-02-24 67 views
1
比較

後,我有這樣的x86彙編代碼:JNB 0(86)

mov  [ebp+var_8], 0 

mov  eax, Str_len 

cmp  [ebp+var_8], eax 

jnb  short loc_4018C4 

如果Str_len總是從0不同,這是什麼JNB執行?我的推理是,如果Str_len變量永遠不會低於0,跳躍永遠不會執行,對吧?

順便說一句,在x86的二進制表示中,寄存器的值如何低於零?

回答

3

jnb(真的是jnc的別名)使用了其中一個「無符號謂詞」,因此就jnb而言,值永遠不會低於零。

但是,零是比較的第一個參數,所以它真的計算0 - eax(然後它只保留標誌,而不是結果),然後它跳轉,如果沒有進位。所以它歸結爲:跳轉,如果Str_len爲零。

3

jnb指令在進位標誌爲零時跳轉。指令cmp根據從dst操作數中減去src操作數的結果更新標誌。 dst操作數是Intel符號中的第一個操作數,因此將根據[ebp+var_8]-eax的結果更新標誌。由於[ebp+var_8]等於零,當eax爲零時進位標誌將被清零,否則設置。總而言之,當eax等於零時,分支將發生。