LES CHAINES
L' assembleur considère comme chaîne toute zone mémoire dont les octets, words, dwords se suivent. Une chaîne est donc une structure de données de même taille.
Les
tableaux, chaînes
de caractères ASCII, Chaînes de
caractères
UNICODE sont des chaînes.
Une chaîne de caractères est un tableau. Chaque élément de ce tableau correspond à un caractère. Un mot, une phrase, un paragraphe, un texte sont des chaînes de caractères.
Il existe trois normes :
ASCII
– American Standards Codes for Information Interchange
La
table ASCII
répertorie un ensemble de caractères tous
codés
sur 7 bits soit 128 caractères. Seuls les
caractères de
32 à 127 ( 20h à 7Fh) sont imprimables.
Les
32 premiers
caractères sont appelés caractères de
contrôle
car ils influent sur le comportement du programme et du
matériel.
C'est le standard AMERICAIN. Seuls les caractères américains sont pris en charge. Donc pas de lettre accentuée, par exemple.
OEM
– Original Equipment Manufacturer
Etant
donné que
la table ASCII codée sur 7 bits n'offrait que
très peu
de possibilités, il a bien fallu augmenter la
capacité de
cette table afin de prendre en compte les caractères
accentués
que l'on trouve dans notre langue, mais également d'autres
caractères graphiques.
Chaque
caractère
de cette table est codé sur 8 bits (1 octet), ce qui offre
256
possibilités.
Cette table reprend la table ASCII pour les 128 premiers caractères et les 128 autres emplacements sont utilisés pour coder d'autres caractères, spécifiques aux pays qui les utilisent.
Ces
caractères sont appelés : caractères
étendus.
Comme ces caractères varient en fonction du pays, il a fallu inventer un système qui permet cela. Ce système s'appelle : Page de codes.
Une page de codes représente un jeu de caractères propre au pays qui l'utilise.
Ci-après
une liste non exhaustive de pages de codes les plus couramment
utilisées :
|
CODE |
LANGUE |
|---|---|
|
Etats Unis |
|
| 737 | Grec |
|
Multilingue (Latin 1) |
|
|
Slave (Latin 2) |
|
|
855 |
Cyrillique (Russe) |
|
Turc |
|
|
860 |
Portugais |
|
861 |
Islandais |
|
863 |
Français (Canada) |
|
865 |
Scandinave |
|
Russe |
|
|
869 |
Grec moderne |
N.B.
: Les caractères OEM sont utilisés sous
MS-DOS.
ANSI
(American National Standards Institute)
Le standard ANSI, tout comme les caractères étendus OEM, utilise le système de page de codes. Chaque caractère est codé sur 8 bits (1 octet).
Ce format est utilisé par les systèmes d'exploitation récents, tel que WINDOWS, LINUX, etc...
Les
128 premiers caractères sont identiques à ceux de
la
table ASCII .
Ce qui change, comme les caractères OEM, c'est la partie supérieure représentée par les 128 derniers caractères.
Le contenu de ces cases dépend de la page de codes
utilisée.
Il
existe énormément
de pages de codes. Ce nombre est fonction des pays qui utilisent des
caractères qu'ils ne retrouvent pas dans la table ASCII ou
dans d'autres Pages de Codes.
Les pages de codes les plus courants sont :
|
CODE |
LANGUE |
|---|---|
| 1250 | Europe centrale |
| 1251 | Cyrillique |
| 1252 | Latin 1 |
| 1253 | Grec |
| 1254 | Turc |
| 1255 | Hébreu |
| 1256 | Arabe |
| 1257 | Baltique |
Mais,
il en existe
d'autres !
Pour savoir quelle page de codes votre ordinateur utilise, tapez ce qui suit en ligne de commandes : chcp
Le
troisième
format correspond à UNICODE. Ce format a
été créé que très
récemment. Il a été
inventé, en 1991, pour prendre en charge un plus grand
panel
de caractères.
Puisque
le format
ASCII et ANSI ne permettent pas de coder plus de 256
caractères
, il a créé le format UNICODE. Ce dernier permet
le
codage de 65536 caractères. Ce qui permet de prendre en
compte
les langages basés sur des idéogrammes tels que
les
caractères chinois, Japonais, Arabes, etc.
Chaque
caractère
est codé sur deux octets ce qui permet 65536
représentations.
Dans ce format, bien entendu, les formats ASCII, OEM et ANSI sont pris en compte. Ils font partie des 256 premiers index de la table UNICODE.
Ce
format permet de
coder l'ensemble des caractères existant dans tous les
langages du monde.
Exemple :
Le
caractère
'A' a l'index 41h (65) ce qui ne change pas.
Le codage sur deux octets est donc : 0041h (L'octet de poids fort est à zéro).
Vue d'ensemble des tables précédemment citées
Pour en savoir plus sur les formats utilisés par Windows
Structure
d'une
chaîne de caractères :
Sous Windows, mais également sous MS-DOS, les chaînes de caractères doivent se terminer systématiquement par le nombre 0. Ce nombre indique la fin de la chaîne. Ce type de chaîne est appelé chaîne AZT (A Zéro Terminal).
Sous
MS-DOS les chaînes peuvent se terminer par le signe : $. Tout
dépend de la fonction utilisée.
Exemple
(WIN32) :
Message DB 'Hello World !',0 ;Chaîne AZT
Voici la représentation de cette chaîne en mémoire :
| H | e | l | l | o | W | o | r | l | d | ! | 0 |
| 48 | 65 | 6C | 6C | 6F | 20 | 57 | 6F | 72 | 6C | 64 | 20 | 21 | 0 |
Comme
je l'ai déjà
expliqué plus haut, un tableau est une suite d'octets,
words,
dwords en mémoire.
Un
tableau de byte
(octet) est une structure contigüe d'information de même type.
On
accède à
chaque élément en utilisant un index, lequel est
multiplié par la taille de l'information que le tableau
contient.
Exemple
:
TableauByte
DB 256 DUP(?)
Dans
la déclaration
ci-dessus on a déclaré un tableau
nommé
TableauByte qui occupe en mémoire 256 octets
représentant 256 éléments
numérotés
de 0 à 255 et dont chaque élément a
une valeur
indéfinie.
L'adresse
offset d'un
élément est toujours de 1 octet.
Ci-dessous
le code qui
permet d'atteindre n'importe quel élément du
tableau :
mov
eax, OFFSET TableauByte
mov dl, [ eax + 3 * 1 ] ;4ème
élément dans le registre dl
mov dl, [ eax + 255 *
1 ] ;256ème et dernier
élément dans le
registre dl
mov dl, [eax] ;1er élément
dans
le registre dl
Rien
de compliqué
!!!
Un
tableau de word (2
octets) est une structure contigüe d'information de même type.
On
accède à
chaque élément en utilisant un index, lequel est
multiplié par la taille de l'information que le tableau
contient.
L'
adresse offset d'un
élément est toujours de 2 octets.
Exemple
:
TableauWord
DW 256 DUP(?)
Dans
la déclaration
ci-dessus, on a déclaré un tableau
nommé
TableauWord qui occupe en mémoire 512 octets composant 256
éléments de deux octets ayant une valeur
indéfinie.
Chaque
élément
est situé à un décalage de 2 octets
par rapport
aux uns et aux autres étant donné que la taille
occupée
en mémoire par un élément est de deux
octets.
Ci-dessous
le code qui
permet d'atteindre n'importe quel élément du
tableau :
mov
eax, OFFSET TableauWord
mov dx, [ eax + 6 * 2 ] ;7ème
élément dans le registre dx
mov dx, [ eax + 255 *
2 ] ;256ème et dernier
élément dans le
registre dx
mov dx, [eax] ;1er élément
dans
le registre dx
Rien de compliqué !!!
Un
tableau de dword (4
octets) est une structure contigüe d'information de même type.
On
accède à
chaque élément en utilisant un index, lequel est
multiplié par la taille de l'information que le tableau
contient.
Exemple
:
TableauDword
DD 256 DUP(?)
Dans
la déclaration
ci-dessus, on a déclaré un tableau
nommé
TableauWord qui occupe en mémoire 1024 octets composant 256
éléments de quatre octets ayant une valeur
indéfinie.
Chaque
élément
est situé à un décalage de 4 octets
par rapport
aux uns et aux autres étant donné que la taille
occupée
en mémoire par un élément est de
quatre octets.
L'
adresse offset d'un
élément est toujours multiple de 4 octets.
Ci-dessous
le code qui
permet d'atteindre n'importe quel élément du
tableau :
mov
eax, OFFSET TableauDword
mov edx, [ eax + 6 * 4 ] ;7ème
élément dans le registre edx
mov edx, [ eax + 255
* 4 ] ;256ème et dernier
élément dans le
registre edx
mov edx, [eax] ;1er élément
dans
le registre edx
Vous avez pu remarquer que la manipulation de structures de données sous forme de tableau de même type n'est en rien bien compliquée.