2014-04-29 102 views
1

可以說我有86如果前面有「添加」命令,「jb」是什麼意思?

add dh, dl   ; These are both unsigned integers. 
jb loc_123456 

是什麼jb表示在這種情況下下面的說明?一般來說,它的意思是「如果下面跳」,但我不確定這意味着什麼。

+0

x86上的IIRC「JB」意思是「如果借用就跳轉」,如果進位標誌被設置爲Simon指出的那麼將會發生...... – stix

回答

2

Intel's Software Developer's Manual「JB」表示「跳轉如果跌破」

5.1.7控制轉移指令 的控制轉移指令提供跳轉,條件跳轉,循環,調用和返回操作控制程序流程。

  • JE/JZ跳轉如果等於/跳轉如果零
  • JNE/JNZ跳轉如果不相等/跳轉如果不是零
  • JA/JNBE跳轉如果以上/如果不低於或等於
  • 跳轉JAE/JNB跳轉如果高於或等於/跳轉如果不低於
  • JB/JNAE跳轉如果低於/如果不大於或等於
  • JBE/JNA跳轉如果低於或等於/跳轉跳轉如果不是上述
  • JG/JNLE跳轉如果更大/跳轉,如果不是l如果少ESS或等於
  • JGE/JNL跳轉如果大於或等於/跳轉如果不小於
  • JL/JNGE跳轉/跳轉如果不大於或等於
  • JLE/JNG跳轉如果小於或等於/跳轉如果不是更大
  • JC跳轉如果攜帶
  • JNC跳轉如果未攜帶
  • JO跳轉如果溢出
  • JNO跳轉如果不上溢
  • JS跳轉如果符號(負)
  • JNS跳轉如果不籤(非負)
  • JPO/JNP跳轉如果奇偶奇/跳轉如果不是奇偶
  • JPE/JP跳轉如果偶校驗/跳轉如果奇偶

有隻有x86條件分支可以識別的8種類型的條件(以及它們的反轉,總共16種)。你使用哪種助記符(同義詞)取決於情況,通常你會使用更有意義的東西。如果您反彙編代碼,那麼反彙編程序可能不夠聰明,無法選擇最有意義的選擇。注意在上面的列表英特爾列出了18條件跳轉,而不是16,這是因爲

  • JB/JNAE/JC所有組裝到同一指令
  • JAE/JNB/JNC所有組裝到同一指令

Here's a convenient table與同義詞分組在一起。

JB通常是 「CMP」,像這樣

cmp dh,dl 
jb loc_123456  ; jump if DH is below DL 

「JB」 分支如果進位標誌被設置後使用。正如前面提到的,你也可以做JNAE「跳轉如果不是大於或等於」

cmp dh,dl 
jnae loc_123456 ; jump if DH is not above or equal to DL 

或以相同的條件分支「JC」

cmp dh,dl 
jc loc_123456  ; jump if there was a carry (borrow) when subtracting DL from DH 

在你的情況下,它可能會是一個更好的選擇用「JC」,跳如果攜帶設定

add dh, dl   ; These are both unsigned integers. 
jc loc_123456   ; Jump if carry set 

這是考慮條件分支作爲測試先前指令的結果方便的 - 但它是在x86阿爾基定義方式EFLAGS註冊是一個「中間人」,持有產生的條件代碼。某些指令(通常是算術,邏輯,比較)更新EFLAGS寄存器以指示操作的結果,而條件分支指令則使用EFLAGS寄存器來確定是否採用分支。有一些關於哪些EFLAGS位由指令計算的奧法規則,有時總是設置爲1或0而不管操作數如何,對於其他指令,某些EFLAGS位未定義,某些指令保留某些EFLAGS位(由指令)。例如,INC和DEC指令保留EFLAGS中的進位標記的內容。旋轉指令更新進位和溢出標誌並保留其他標誌,如果計數大於1,溢出標誌在旋轉後未定義。等等。

下面是一個人爲的例子來說明問題。在這個例子中,條件分支正在測試在兩個不同的8位寄存器上運行的兩條不同指令的結果。

rol dl,1 
inc dh 
jnbe loc_123456 

ROL旋轉指令將DL左移一位,將EFLAGS進位標誌設置爲旋轉的最後一位。 INC指令將DH遞增1,保留EFLAGS進位標誌,並在EFLAG中設置其他算術標誌。如果EFLAGS進位標誌爲零且EFLAGS零標誌清零,則JNBE爲「如果不低於或等於則跳轉」。如果在DH遞增後DH寄存器不爲零(除非DH爲0xFF,並且遞增後將其包裝爲0x00),則零標誌被清除。進位標誌被設置爲與左旋轉的最後一位相匹配,換句話說,在左旋轉(以前是最重要的位)之後的DL的最低有效位。如果將JNBE看作「如果不低於或等於跳躍」,JNBE就沒有多大意義,但如果將它看作是對進位標誌和零標誌是否均爲零的測試,則可能是有意義的。

+0

希望在這裏有些清楚。爲什麼最重要的評論說它意味着「如果借用就跳」,例如有溢出? –

+0

@KevinBurke評論說「IIRC」(如果我記得正確) - 但是不正確。我在上面的回答中添加了更多信息和參考英特爾文檔。 – amdn

5

jb如果進位標誌置位,則跳轉,當溢出時溢出。

如果其中一個整數已經簽名,我們還必須查看符號位,並使用jg指令代替。

相關問題