+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1

    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 : -1
    Points
    -1

    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 confirmé
    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 : 210
    Points
    210

    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
    Invité régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    février 2013
    Messages
    13
    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 : 13
    Points : 7
    Points
    7

    Par défaut Autre solution

    Bonjour,


    MAJUSCULE vers minuscule
    Code :
    1
    2
    mov al, "A"
    and al, 95 ;
    merci Prof

    minuscule vers MAJUSCULE
    Code :
    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 éclairé
    Profil pro
    Inscrit en
    juin 2002
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : juin 2002
    Messages : 136
    Points : 303
    Points
    303

    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 :
    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 :
    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
    Invité régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    février 2013
    Messages
    13
    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 : 13
    Points : 7
    Points
    7

    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 :
    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 éclairé
    Profil pro
    Inscrit en
    juin 2002
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : juin 2002
    Messages : 136
    Points : 303
    Points
    303

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •