TUTORIAL ASSEMBLEUR - chapitre 1


Les bases indispensables pour dbuter
-------------------------------------

Dfinition de l'assembleur
--------------------------

L'assembleur est un language de programmation transformant un fichier texte contenant des 
instructions, en un programme que le processeur peut comprendre (programme en language machine).
Ce language machine a la particularit d'tre difficile  programmer car il n'est compos que 
de nombres en hxadcimal (base 16). L'assembleur est une "surcouche" du language machine, il 
permet d'utiliser des instructions qui seront transformes en language machine donc il prsente
une facilit de programmation bien plus grande que le language machine. Le fichier texte
qui contient ces instructions s'appelle le source.

Le language hxadcimal
-----------------------

Nous allons aborder un aspect trs important de la programmation en assembleur : le systme de 
numrotation en hxadcimal. Ce systme est bas sur l'utilisation des chiffres et de certaines
lettres de l'alphabet (de A  F). Vous connaissezbien entendu le systme dcimal (base 10). 
En assembleur, les nombres dcimals sont suivis d'un "d" (1000=1000d) mais en principe la 
majorit des assembleurs calculent en dcimal par dfaut. Maintenant, prenons un systme  
base 5  (les 5 doigs de votre main). Nous allons compter en base 5. On commence par 0 (doigt 0), 
1 (doigt 1), 2 (doigt 2), 3 (doigt 3), 4 (doigt 4). Problme..Comment faire pour reprsenter 5 ? 
C'est simple. Comme la base 5 nous permet de reprsenter des nombres avec les chiffres 
0-1-2-3-4, on fait comme en base dix, on rajoute un 1 devant. Ce qui donne (doigt 5)=10 
et (doigt 7)=12. En fait, quand on arrive  la fin d'un "cycle", on rajoute ou augmente 
le premier chiffre du nombre.

Mais revenons  notre base 16. Nous allons faire la mme chose que pour la base 5, cependant
nous ne sommes plus limits dans la reprsentation (chiffre de 0  9). Nous arrivons  
9 (9d), maintenant comment faire le 10. Nous allons utiliser des lettres (10d=0A) et nous 
irons jusqu' 15 (15d=0F). Nous ne pouvons pas utiliser le G et les lettres qui suivent, 
donc nous augmenterons le premier chiffre ce qui donne 16d=10. Continuez ainsi jusqu' 255 
qui fait FF. Et aprs. Et bien on continue. 256d=0100h (le h et le zro qui prcdre indiquent 
que ce nombre est en hexadcimal). 257d=101h. 65535=FFFFh. Bon, je pense que vous avez compris. 
Pour convertir des nombres du dcimal en hxa, vous pouvez utiliser la calculatrice de Windows 
en mode scientifique. 

Je vais finir mon explication avec le calcul binaire. Vous savez probablement que les ordinateurs 
calculent en base 2 (0 ou 1). Le calcul binaire consiste  mettre un 1 ou un 0 selon la valeur 
dsire. Chaque 0 ou 1 est appel un bit, 8 bits forment un octet.

Pour le nombre 1, nous avons 00000001b (le b signifie binaire). Un nombre binaire se dcompose 
comme-ceci : 
                                128|64|32|16|8|4|2|1

Pour le nombre 1, la premire case est remplie (1=rempli). Pour avoir le nombre 2, 
nous aurons 00000010b et pour le nombre 3, nous aurons 00000011 
(1 case=1 - 2me case=1 => 1+2=3). Le nombre 11111111b donnera 255 puisque en
additionant 1+2+4+...+128, on obtient 255. Plus il y a de bits, plus le nombre peut 
tre grand, nous verrons plus tard qu'il existe diffrentes units selon le nombre de bits.

Le processeur et ses registres
------------------------------

Le processeur est compos de diffrentes parties. Les registres sont les lments les plus 
importants du processeur pour celui qui programme en asm. Les registres sont souvent reprsents
comme des cases dans lesquelles sont stocks diffrentes valeurs de diffrentes tailles selon
le type et le nom du registre. Il existe plusieurs types de registres : 

- registres gnraux
- registres d'tats
- registres de segment

Nous allons nous intresser aux registres gnraux et aux registres de segment. 

On a plusieurs registres gnraux qui commencent par A,B,C et D. Ces quatres registres 
sont les plus utiliss. Le 1er,  AX (registre de 16 bits) qui se divise en deux 
petits registres de 8 bits, AL (l=low=bas) et AH (h=high=haut). 

Nous avons ensuite BX (BL et BH), CX (CL et CH) et DX (DL et DH), ces registres sont
diviss comme AX en 2 parties hautes et basses. 

On peut rajouter un "E" devant les registres 16 bits afin d'obtenir un registre 32 bits. 
Ce qui donne EAX,EBX,ECX et EDX. Notez que l'on ne peut avoir de EAH ou ECL. La partie
haute d'un registre 32 bits, n'est pas directement accessible, on doit utiliser
diffrentes instructions afin de la faire "descendre" dans un registre de 16 bits et
pouvoir finalement l'utiliser. 

Ces registres peuvent contenir une valeur correspondant  leur capacit. 
AX=65535 au maximum (16 bits) et AL=255 au maximum (8 bits). Je rpte que la partie haute 
du registre 32 bits ne peut pas tre modifie comme un registre. Elle peut tre modifie
seulement si l'on modifie tout le registre 32 bits (y compris la partie basse), ou par
le biais de quelques instructions qui permettent de copier la partie basse du registre
dans la partie haute, mais cela ne nous concerne pas pour l'instant.

Les processeurs 286 et moins ne peuvent pas utiliser les registres 32 bits (EAX,EBX,ECX,EDX 
= impossible). Ce n'est qu' partir du 386 que l'utilisation du 32 bits est possible. 

Pour terminer, je vais parler des registres pointeurs qui sont DI (destination index), 
SI (source index), BP (base pointer), IP (instruction pointer) et SP (stack pointer). 
Ces registres peuvent eux aussi tre tendus  32 bits en rajoutant un "E" 
(EDI,ESI,EIP,ESP,EBP). Ces registres n'ont pas de partie 8 bits, il n'y a pas de EDL ou de ESH.

Les registres SI et DI sont le plus souvent employs pour les instructions de chane 
et pour acceder  des blocs en mmoire. Le registre SP est utilis pour acceder  la pile.
Nous ne l'employons presque pas, sauf pour du code trs spcifique.

Le processeur et ses registres de segment
----------------------------------------

Pour pouvoir chercher et placer des choses dans sa mmoire, un ordinateur a besoin de ce 
qu'on appelle une adresse. Celle-ci se compose de deux parties de 32 bits (ou 16 bits, cela
dpend du mode employ).  La premire est le segment et la deuxime, l'offset. 

Voici un exemple :
0A000h:00000h (adresse de la mmoire vido)

Dans cet exemple, il s'agit d'un adressage 16 bits. L'adressage 16 bits s'utilise en 
mode _rel_. Le mode rel est un tat du processeur o il ne peut accder  des blocs
de taille suprieure  16 bits (65536 bytes). Le 286 introduira un mode dit protg
qui permet de franchir cette barrire pour pouvoir accder  quasiment tout la RAM
en un bloc (ce mode protg sera grandement amlior  partir du 386). 
Nous nous contenterons du mode rel au dbut, car il est plus simple mais il prsente 
tout de mme des limites. Sur 386, les segments ont t conservs pour garder une 
certaine comptabilti avec les vieilles gnrations de PC.

Les registres de segment ne sont que lus et cris sur 16 bits. Le 386 utilise un 
offset de 32 bits (sauf en mode rel o il travaille toujours en 16 bits). Voici
la liste de ces segments, ils sont au nombre de 6 :

- CS (code segment)
- SS (stack segment)
- DS (data segment)
- ES (extra segment)
- FS (extra segment - seulement  partir du 386)
- GS (extra segment - seulement  partir du 386)

### Chapitre 1 - dake / c a l o d o x ###
### http://www.space.ch/scene/calodox ###
