IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Assembleur Discussion :

avec un asm 8086 convertir un caractère en majuscule et vice versa


Sujet :

Assembleur

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Services de proximité

    Informations forums :
    Inscription : Mars 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut avec un asm 8086 convertir un caractère en majuscule et vice versa
    salut !!!

    je fais mes débuts avec l'assembleur et j'aimerais savoir comment convertir un caractère minuscule en majuscule et majuscule en minuscule. Votre aide me sera d'une grande utilité, merçi

  2. #2
    Membre actif
    Avatar de EtherOS
    Homme Profil pro
    Etudiant Polytechnicien
    Inscrit en
    Juillet 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Etudiant Polytechnicien
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 58
    Points : 233
    Points
    233
    Par défaut proposition
    Vous pouvez utiliser les codes ASCII 97 à 122 pour a à z et 65 à 90 pour A à Z.

    lorsque tu as un charMaj pour convertir en charMin tu ajoute 13 en ASCII

    charMin(en ASCII) = charMaj(en ASCII) + 13

    et lorsque tu as plutot un charMin tu retranche 13 pour convertir en charMaj en ASCII.

    si l'adresse A contient le code ASCII du caractère tu fais
    ; si A est en minuscule
    MOV AX, A
    SUB AX, 13
    : si A est en majuscule
    MOV AX, A
    ADD AX, 13

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Santé

    Informations forums :
    Inscription : Février 2013
    Messages : 15
    Points : 29
    Points
    29
    Par défaut Autre solution
    Bonjour,


    MAJUSCULE vers minuscule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mov al, "A"
    and al, 95 ;
    merci Prof

    minuscule vers MAJUSCULE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mov al, "a"
    or al, 32  ;
    merci Prof

    Uniquement avec les codes ASCII 97 à 122 pour a à z et 65 à 90 pour A à Z, comme le précise EtherOS

    Édite : correction erreur 32=20h et non 32h Honte à moi , merci Prof

  4. #4
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Bonjour,

    La différence entre le code ASCII d'une majuscule et celui de la minuscule est de 32 et non pas de 13.

    En effet le code ASCII de 'A' est 65, celui de 'a' est 97, la différence est donc 97 - 65 = 32.

    D'autre part, avant de faire passer un caractère en majuscule, il faut s'assurer qu'il est bien en minuscule.
    Surtout qu'il existe d'autres caractères que les majuscules ou les minuscules ...
    Un test s'impose donc avant d'ajouter ou de retrancher 32 au caractère.

    Exemple de code, avec deux procédures faisant le travail souhaité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    ; entrer avec AL contient le caractère à modifier
     
    Majuscule       proc
     
            cmp     AL,'a'
            jb      short @@1
            cmp     AL,'z'
            ja      short @@1
            sub     AL,32
     
    @@1:    ret
     
    Majuscule       endp
     
    Minuscule       proc
     
            cmp     Al,'A'
            jb      short @@1
            cmp     AL,'Z'
            ja      short @@1
            add     AL,32
     
    @@1:    ret
     
    Minuscule       endp
    Par ailleurs, 32 s'écrit 20h en hexadécimal.
    On peut donc écrire les deux procédures précédentes sous la forme équivalente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    ; entrer avec AL contient le caractère à modifier
     
    Majuscule     proc
     
            cmp   AL,'a'
            jb    short @@1
            cmp   AL,'z'
            ja    short @@1
            sub   AL,20h
     
    @@1:    ret
     
    Majuscule     endp
     
    Minuscule     proc
     
            cmp   Al,'A'
            jb    short @@1
            cmp   AL,'Z'
            ja    short @@1
            add   AL,20h
     
    @@1:    ret
     
    Minuscule     endp
    Ensuite, on peut remplacer l'instruction "add AL,20h" par "or AL,20h" dans la procédure Minuscule parce que, si AL est compris entre 65 et 90, cela revient au même.
    Mais les instructions "add AL,20h" et "or AL,20h" ne sont pas équivalentes en toutes circonstances.

    Enfin, si on veut remplacer l'instruction "sub AL,20h" de la procédure Majuscule par "and AL,quelque chose", il faut réfléchir soigneusement à l'écriture binaire de 20h.
    En binaire, 20h s'écrit 00100000b : tous les bits sont nuls, sauf le bit5 qui vaut 1.
    ( les bits sont numérotés de droite à gauche, en commençant par le bit0 )
    Pour soustraire 20h, il faut donc supprimer le bit5 du registre AL, sans modifier les autres bits.
    Il faut donc faire "and AL" avec 11011111b, nombre qui s'écrit DFh en hexadécimal, soit encore 223 en décimal.

    Personnellement, je déconseille de remplacer "sub AL,20h" par "and AL,DFh" car cela nuit à la lisibilité du code.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Santé

    Informations forums :
    Inscription : Février 2013
    Messages : 15
    Points : 29
    Points
    29
    Par défaut Simplification ?!?
    @Prof

    Merci pour ta réponse très claire.
    j'ai édité mon message pour corriger mon erreur.

    L'utilisation du masque 20h (100000b) permet en utilisant ton exemple de diminuer les testes (ja, jb) plus deux "call".
    L'opérateur and modifie les "flags" Zero et Sign en fonction du résultat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    ; AL contient le caractère à modifier
     
    ModifCaract proc
     
    push al       ; sauvegarde AL
    and al, 20h ; masque 100000b
                    ; les caractères ASCII de 65 à 90 and  20h = AL = 0
    jz minuscule
    pop al        ; restaure AL
    sub     AL, 20h  ; ou sub     AL, 32
    ret
     
    minuscule : 
    pop al
    add   AL,20h  ; ou add   AL, 32
    ret
     
    ModifCaract endp

    Tiens, je n'arrive pas a valider la balise "quote" avec Firefox ?!?

  6. #6
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Bonjour,

    On peut éviter les instruction PUSH AL et POP AL en utilisant l'instruction TEST à la place de AND.

    En effet, l'instruction "AND AL,20h" modifie les Flags et le registre AL,
    alors que l'instruction "TEST AL,20h" modifie les Flags mais conserve AL.

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Réponses: 2
    Dernier message: 31/08/2011, 14h49
  3. [Lazarus] Convertir un byte en integer, et vice versa
    Par camcam10 dans le forum Lazarus
    Réponses: 2
    Dernier message: 14/05/2011, 01h17
  4. Réponses: 0
    Dernier message: 13/06/2006, 16h11
  5. Réponses: 3
    Dernier message: 28/09/2003, 10h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo