後,我有這樣的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的二進制表示中,寄存器的值如何低於零?
後,我有這樣的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的二進制表示中,寄存器的值如何低於零?
jnb
(真的是jnc
的別名)使用了其中一個「無符號謂詞」,因此就jnb
而言,值永遠不會低於零。
但是,零是比較的第一個參數,所以它真的計算0 - eax
(然後它只保留標誌,而不是結果),然後它跳轉,如果沒有進位。所以它歸結爲:跳轉,如果Str_len
爲零。
jnb
指令在進位標誌爲零時跳轉。指令cmp
根據從dst
操作數中減去src
操作數的結果更新標誌。 dst
操作數是Intel符號中的第一個操作數,因此將根據[ebp+var_8]-eax
的結果更新標誌。由於[ebp+var_8]
等於零,當eax
爲零時進位標誌將被清零,否則設置。總而言之,當eax
等於零時,分支將發生。