инструкции `js` и` jb` в сборке - PullRequest
0 голосов
/ 23 ноября 2018

Мне трудно понять, что именно делают инструкции js и jb.Я понимаю, что jb это прыжок, если внизу.Но какая разница между jb и jle.И точно так же, js мне кажется, что это эквивалентно jb, так как это означает переход, если подписан.Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Существует удобная таблица, которая очень хорошо объясняет, какую Jcc инструкцию использовать:

Условия перехода и флаги:

Mnemonic        Condition tested  Description  
jo              OF = 1            overflow 
jno             OF = 0            not overflow 
jc, jb, jnae    CF = 1            carry / below / not above nor equal
jnc, jae, jnb   CF = 0            not carry / above or equal / not below
je, jz          ZF = 1            equal / zero
jne, jnz        ZF = 0            not equal / not zero
jbe, jna        CF or ZF = 1      below or equal / not above
ja, jnbe        CF or ZF = 0      above / not below or equal
js              SF = 1            sign 
jns             SF = 0            not sign 
jp, jpe         PF = 1            parity / parity even 
jnp, jpo        PF = 0            not parity / parity odd 
jl, jnge        SF xor OF = 1     less / not greater nor equal
jge, jnl        SF xor OF = 0     greater or equal / not less
jle, jng    (SF xor OF) or ZF = 1 less or equal / not greater
jg, jnle    (SF xor OF) or ZF = 0 greater / not less nor equal 
0 голосов
/ 23 ноября 2018
Ветвь

jbja) основана на результате флагов unsigned , в отличие от условия ветки Signed для jg, jge,jl и jle.

При сравнении без знака MSB включается как часть самого числа, а не как указание его знака.Например:

 ; Intel                          ; ; AT&T
 mov eax, 08000000h               ; mov $0x8000000, %eax
 mov ecx, 00000001h               ; mov $0x0000001, %ecx
 cmp eax, ecx                     ; cmp %ecx, %eax
 jl mybranch ; branch taken       ; jl mybranch ; branch taken

Принимая во внимание:

 mov eax, 08000000h               ; mov $0x8000000, %eax
 mov ecx, 00000001h               ; mov $0x0000001, %ecx
 cmp eax, ecx                     ; cmp %ecx, %eax
 jb mybranch ; branch not taken   ; jb mybranch ; branch not taken

js будет разветвляться только на основе состояния флага знака в регистре (R|E)FLAGS

...