可以說我有86如果前面有「添加」命令,「jb」是什麼意思?
add dh, dl ; These are both unsigned integers.
jb loc_123456
是什麼jb
表示在這種情況下下面的說明?一般來說,它的意思是「如果下面跳」,但我不確定這意味着什麼。
可以說我有86如果前面有「添加」命令,「jb」是什麼意思?
add dh, dl ; These are both unsigned integers.
jb loc_123456
是什麼jb
表示在這種情況下下面的說明?一般來說,它的意思是「如果下面跳」,但我不確定這意味着什麼。
據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,這是因爲
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就沒有多大意義,但如果將它看作是對進位標誌和零標誌是否均爲零的測試,則可能是有意義的。
希望在這裏有些清楚。爲什麼最重要的評論說它意味着「如果借用就跳」,例如有溢出? –
@KevinBurke評論說「IIRC」(如果我記得正確) - 但是不正確。我在上面的回答中添加了更多信息和參考英特爾文檔。 – amdn
jb
如果進位標誌置位,則跳轉,當溢出時溢出。
如果其中一個整數已經簽名,我們還必須查看符號位,並使用jg
指令代替。
x86上的IIRC「JB」意思是「如果借用就跳轉」,如果進位標誌被設置爲Simon指出的那麼將會發生...... – stix