Je commence montage, j'utilise NASM pour assembler le code, J'essaie de traiter une chaîne résidant en mémoire et de le changer, Je veux vérifier si un octet est dans une certaine gamme (ASCII) afin que je puisse décider quoi faire avec elle, Je n'arrive pas à comprendre comment vérifier si une valeur est dans une certaine gamme, je sais tout Les différents types de drapeaux de saut, mais comment puis-je combiner 2 déclarations CMP?
Ma question est la suivante: Comment puis-je produire quelque chose de similiaire à cet égard? P>
if (x>=20 && x<=100) do something
4 Réponses :
Comme ça?
x<20 if false jump to ELSE x>100 if false jump to ELSE do something jump to ENDIF :ELSE do something else :ENDIF
Oui ... y a-t-il une façon d'utiliser une seule instruction? ou une quantité minimale d'entre eux
Une instruction en montage fait une chose i>. Si vous ne faites pas une seule chose, il ne peut pas être fait dans une seule instruction, à moins que leur instruction est une instruction spéciale pour cette affaire. L'assemblage est très verbeux.
Selon la syntaxe que vous utilisez, et en supposant que x code> est dans le registre
EAX code>, quelque chose comme ceci:
cmp eax, 20
jl ELSE
cmp eax, 100
jg ELSE
#do something
jmp END
ELSE:
#do else
END:
Mais, après que la comparaison de EAX avec 20 est assortie, il saute à l'étiquette d'autre sans vérifier le 2e saut conditionnel. en question, l'état inclure && (et) l'opération non || (OU).
@Ameerhamza par les lois de Morgan, ! (A && B) == (! A ||! B) code>, et ce dernier est ce qui est exprimé ici, alors que nous allons à
sinon Code> Lorsque l'une ou l'autre des conditions n'est pas remplie, elle ne saute donc que lorsque les deux sont i> rencontrés.
Vous pouvez essayer de la compiler à partir d'une langue de niveau supérieur (C / C ++ / ...) avec des optimalisations à High (-O3 pour GCC) et consultez ce que le compilateur génère (Objdump). Il devrait générer du code très efficace. P>
Je suggérerais presque la courir sans optimisations d'abord. Le fonctionnement peut entraîner un code qui n'est pas facile à comprendre au début (instructions plus exotiques). Regardez certainement le code de tous les niveaux d'optimisation (y compris non).
là est em> un moyen d'exprimer une gamme Vérifiez comme si ceci à l'aide d'un seul saut conditionnel: unsigned int upperBound = 100;
unsigned int lowerBound = 20;
if (yourValue - lowerBound <= upperBound - lowerBound) {
// do something
}
Les compilateurs connaissent cette optimisation, au moins pour les gammes de compilation-temps-constant (même en utilisant le truc de comparaison non signé pour des gammes signées). Ils ne peuvent pas le faire en toute sécurité lorsque les limites ne sont pas connues au moment de la compilation et ne l'échouent dans certains cas même s'ils peuvent prouver que supérieur> inférieur code> avec des gammes variables d'exécution, cependant. gcc.gnu.org/bugzilla/show_bug.cgi?id=69615.