Précédent   Forum du club des développeurs et IT Pro > Autres langages > Assembleur
Assembleur Forum d'entraide Assembleur. Avant de poster -> F.A.Q Assembleur Tutoriels Assembleur
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 04/02/2013, 18h30   #1
narny14
Invité de passage
 
Homme
Étudiant
Inscription : mars 2011
Messages : 1
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 : 1
Points : 0
Points : 0
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
narny14 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2013, 21h25   #2
EtherOS
Membre habitué
 
Avatar de EtherOS
 
Homme Lionel Tidjon
Etudiant Polytechnicien
Inscription : juillet 2012
Messages : 51
Détails du profil
Informations personnelles :
Nom : Homme Lionel Tidjon
Localisation : Cameroun

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

Informations forums :
Inscription : juillet 2012
Messages : 51
Points : 110
Points : 110
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
EtherOS est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/02/2013, 00h01   #3
Valente82
Invité régulier
 
Homme Thierry
Technicien maintenance
Inscription : février 2013
Messages : 9
Détails du profil
Informations personnelles :
Nom : Homme Thierry
Localisation : France, Tarn et Garonne (Midi Pyrénées)

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

Informations forums :
Inscription : février 2013
Messages : 9
Points : 5
Points : 5
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
Valente82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2013, 14h16   #4
Prof
Membre confirmé
 
Inscription : juin 2002
Messages : 113
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : juin 2002
Messages : 113
Points : 217
Points : 217
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.
Prof est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/02/2013, 22h21   #5
Valente82
Invité régulier
 
Homme Thierry
Technicien maintenance
Inscription : février 2013
Messages : 9
Détails du profil
Informations personnelles :
Nom : Homme Thierry
Localisation : France, Tarn et Garonne (Midi Pyrénées)

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

Informations forums :
Inscription : février 2013
Messages : 9
Points : 5
Points : 5
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 ?!?
Valente82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2013, 08h41   #6
Prof
Membre confirmé
 
Inscription : juin 2002
Messages : 113
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : juin 2002
Messages : 113
Points : 217
Points : 217
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.
Prof est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h44.


 
 
 
 
Partenaires

Hébergement Web