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.

CHAÎNE DE CARACTERES

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.

Codage des 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.

Afficher la table

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

437

Etats Unis

737 Grec

850

Multilingue (Latin 1)

852

Slave (Latin 2)

855

Cyrillique (Russe)

857

Turc

860

Portugais

861

Islandais

863

Français (Canada)

865

Scandinave

866

Russe

869

Grec moderne

N.B. : Les caractères OEM sont utilisés sous MS-DOS.


ANSI (American National Standards Institute)

Http://ansi.org

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


Pour changer une page de codes, laquelle sera exploitée dans les applications Windows, suivez les étapes suivantes :
  1. Allez dans le Panneau de configuration puis cliquez sur l'icône : "Options régionales et linguistiques"
  2. Cliquez sur l'onglet : "Options avancées"
  3. Déroulez la liste puis sélectionnez la page de codes du pays que vous désirez.
  4. Cliquez sur le bouton : "Appliquez" et répondez "OUI" à la question proposée.
  5. L'ordinateur redémarrera.
  6. Une fois revenu dans votre session, lancez l'invite MS-DOS et tapez : chcp
  7. Un message indiquant la page de codes actuellement utilisée apparaît.
Pour charger une nouvelle page de codes, faites de nouveau les étapes 1 à 7.

Cela permet d'utiliser des pages de codes uniquement dans l'invite MS-DOS et les applications Windows en utilisant la combinaison de touches suivantes : ALT (gauche) + le numéro du caractère de la table sélectionnée (utilisez le pavé numérique).

UNIversal CODE

Http://www.unicode.org

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

et sous forme codée en hexadécimal :

48 65 6C 6C 6F 20 57 6F 72 6C 64 20  21 0

Qu'est-ce qu'un tableau :

Comme je l'ai déjà expliqué plus haut, un tableau est une suite d'octets, words, dwords en mémoire.

TABLEAU DE BYTE

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é !!!

TABLEAU DE WORD

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é !!!

TABLEAU DE DWORD

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.