Pouvez-vous s'il vous plaît me dire la différence entre JUMP IF ABOVE AND JUMP IF GREATER in Assembly language? quand dois-je utiliser chacun d'eux? me donnent-ils des résultats différents?
Comme le manuel d'Intel explique , JG interprète les indicateurs comme si la comparaison était signée, et JA interprète les indicateurs comme si la comparaison n'était pas signée (bien sûr si l'opération qui a défini les indicateurs n'était pas une comparaison ou une soustraction , cela peut ne pas avoir de sens). Alors oui, ils sont différents. Pour être précis,
ja
saute si CF = 0
et ZF = 0
(non signé ci-dessus: pas de report et pas égal)jg
saute si SF = OF
et ZF = 0
(signé Supérieur, hors égal)Par exemple,
cmp eax, edx
ja somewhere ; will go "somewhere" if eax >u edx
; where >u is "unsigned greater than"
cmp eax, edx
jg somewhere ; will go "somewhere" if eax >s edx
; where >s is "signed greater than"
>u
et >s
convient pour les valeurs avec le bit supérieur zéro, mais les valeurs avec le bit supérieur défini sont traitées comme négatives par >s
et aussi grand par >u
(bien sûr, si les deux opérandes ont le bit supérieur défini, >u
et >s
de nouveau d'accord).
JA
est utilisé pour sauter si la dernière instruction "changement de drapeau" était sur des nombres non signés. mais d'autre part, JG
est utilisé pour sauter si la dernière instruction "changement de drapeau" était sur des nombres signés.