6
votes

Double condition vérification en montage

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


0 commentaires

4 Réponses :


0
votes

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


2 commentaires

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 . 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.



6
votes

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:


2 commentaires

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) , et ce dernier est ce qui est exprimé ici, alors que nous allons à sinon Lorsque l'une ou l'autre des conditions n'est pas remplie, elle ne saute donc que lorsque les deux sont rencontrés.



1
votes

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.


1 commentaires

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).



29
votes

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
}


1 commentaires

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 avec des gammes variables d'exécution, cependant. gcc.gnu.org/bugzilla/show_bug.cgi?id=69615.