Assemblaggio – JG / JNLE / JL / JNGE dopo CMP

Non capisco le istruzioni JG/JNLE/JL/JNGE , che vengono dopo CMP.

per esempio, se ho:

 CMP al,dl jg label1 

Quando al=101; dl =200 al=101; dl =200 .

Su quello che chiediamo alla jg ? È su al>dl ? o al-dl>0 ?

Stesso prolbem sul prossimo codice:

 test al,dl jg label1 

Non capisco cosa confrontiamo e su cosa chiediamo al ” jg “.

In altre parole, non capisco quando salteremmo su label1 e quando non lo faremo.

Grazie.

Quando fai un cmp a,b , i flag sono impostati come se avessi calcolato a - b .

Quindi le istruzioni jmp -type controllano quei flag per vedere se il salto dovrebbe essere fatto.

In altre parole, il primo blocco di codice che hai (con i miei commenti aggiunti):

 cmp al,dl ; set flags based on the comparison jg label1 ; then jump based on the flags 

saltava a label1 se e solo se al era maggiore di dl .

Probabilmente starai meglio a pensarlo come al > dl ma le due scelte che hai sono matematicamente equivalenti:

 al > dl al - dl > dl - dl (subtract dl from both sides) al - dl > 0 (cancel the terms on the right hand side) 

Devi stare attento quando usi jg in quanto assume che i tuoi valori siano stati firmati. Quindi, se si confrontano i byte 101 (101 in complemento a due) con 200 (-56 in complemento a due), il primo sarà effettivamente maggiore. Se questo non è ciò che si desidera, è necessario utilizzare il confronto senza segno equivalente.

Vedi qui per maggiori dettagli sulla selezione del salto, riprodotta di seguito per completezza. Innanzitutto quelli in cui la firma non è appropriata:

 +--------+------------------------------+-------------+--------------------+ |Instr | Description | signed-ness | Flags | +--------+------------------------------+-------------+--------------------+ | JO | Jump if overflow | | OF = 1 | +--------+------------------------------+-------------+--------------------+ | JNO | Jump if not overflow | | OF = 0 | +--------+------------------------------+-------------+--------------------+ | JS | Jump if sign | | SF = 1 | +--------+------------------------------+-------------+--------------------+ | JNS | Jump if not sign | | SF = 0 | +--------+------------------------------+-------------+--------------------+ | JE/ | Jump if equal | | ZF = 1 | | JZ | Jump if zero | | | +--------+------------------------------+-------------+--------------------+ | JNE/ | Jump if not equal | | ZF = 0 | | JNZ | Jump if not zero | | | +--------+------------------------------+-------------+--------------------+ | JP/ | Jump if parity | | PF = 1 | | JPE | Jump if parity even | | | +--------+------------------------------+-------------+--------------------+ | JNP/ | Jump if no parity | | PF = 0 | | JPO | Jump if parity odd | | | +--------+------------------------------+-------------+--------------------+ | JCXZ/ | Jump if CX is zero | | CX = 0 | | JECXZ | Jump if ECX is zero | | ECX = 0 | +--------+------------------------------+-------------+--------------------+ 

Quindi quelli non firmati:

 +--------+------------------------------+-------------+--------------------+ |Instr | Description | signed-ness | Flags | +--------+------------------------------+-------------+--------------------+ | JB/ | Jump if below | unsigned | CF = 1 | | JNAE/ | Jump if not above or equal | | | | JC | Jump if carry | | | +--------+------------------------------+-------------+--------------------+ | JNB/ | Jump if not below | unsigned | CF = 0 | | JAE/ | Jump if above or equal | | | | JNC | Jump if not carry | | | +--------+------------------------------+-------------+--------------------+ | JBE/ | Jump if below or equal | unsigned | CF = 1 or ZF = 1 | | JNA | Jump if not above | | | +--------+------------------------------+-------------+--------------------+ | JA/ | Jump if above | unsigned | CF = 0 and ZF = 0 | | JNBE | Jump if not below or equal | | | +--------+------------------------------+-------------+--------------------+ 

E, infine, quelli firmati:

 +--------+------------------------------+-------------+--------------------+ |Instr | Description | signed-ness | Flags | +--------+------------------------------+-------------+--------------------+ | JL/ | Jump if less | signed | SF <> OF | | JNGE | Jump if not greater or equal | | | +--------+------------------------------+-------------+--------------------+ | JGE/ | Jump if greater or equal | signed | SF = OF | | JNL | Jump if not less | | | +--------+------------------------------+-------------+--------------------+ | JLE/ | Jump if less or equal | signed | ZF = 1 or SF <> OF | | JNG | Jump if not greater | | | +--------+------------------------------+-------------+--------------------+ | JG/ | Jump if greater | signed | ZF = 0 and SF = OF | | JNLE | Jump if not less or equal | | | +--------+------------------------------+-------------+--------------------+ 

Wikibooks ha un sumrio abbastanza buono delle istruzioni di salto . Fondamentalmente, ci sono in realtà due fasi:

 cmp_instruction op1, op2 

Che imposta vari flag in base al risultato e

 jmp_conditional_instruction address 

che eseguirà il salto in base ai risultati di quelle bandiere.

Compare ( cmp ) calcolerà fondamentalmente la sottrazione op1-op2 , tuttavia, questo non viene memorizzato; invece vengono impostati solo i risultati di flag. Quindi se hai fatto cmp eax, ebx a dire eax-ebx , decidendo poi se è positivo, negativo o zero quali flag impostare.

Riferimento più dettagliato qui .

Il comando JG significa semplicemente: Salta se maggiore . Il risultato delle istruzioni precedenti è memorizzato in alcuni flag del processore (in questo testerebbe se ZF = 0 e SF = OF) e l’istruzione di salto agisce in base al loro stato.