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
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
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
Bonjour,
MAJUSCULE vers minuscule
merci Prof
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 mov al, "A" and al, 95 ;
minuscule vers MAJUSCULE
merci Prof
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 mov al, "a" or al, 32 ;
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
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é :
Par ailleurs, 32 s'écrit 20h en hexadécimal.
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
On peut donc écrire les deux procédures précédentes sous la forme équivalente :
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.
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
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
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 ?!?
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.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager