samedi 29 août 2009

Partie I - Chapitre 1 : Qu'est-ce que l'assembleur ?

Un langage informatique n'est, en pratique, qu'une suite d'instructions que le programmeur demande d'accomplir à une machine. Il existe différents types de langages informatiques. Nous pouvons distinguer trois grandes catégories de langages :

  • le langage machine ;
  • les langages assembleurs ;
  • les langages de haut niveau.
Dans cette partie nous situerons l'assembleur à travers les différents types de langages existants. Nous en ferons ensuite une rapide présentation.

Sommaire du chapitre :

  • A - Les catégories de langages
  • B - L'assembleur 80x86

A - Les catégories de langages


1 - Langage machine


Le langage machine est celui qui est directement compréhensible par le processeur. Ce dernier ne comprend que les 0 et les 1. Les opérations simples deviennent d'énormes suites de 0 et de 1 incompréhensibles.
Voici ci-dessous le code permettant de calculer 2 + 2. La première ligne permet de mettre dans AX, un des registres du processeur, la valeur 2. Nous verrons en détail par la suite ce que c'est, considérons pour l'instant qu'il s'agit d'une variable qui prend dans ce cas la valeur 2. Ensuite la deuxième ligne permet d'y ajouter 2, représenté par 00000010 en binaire (que nous apprendrons à manipuler par la suite).

Code Machine
1
2
10111000 00000010 00000000
00000101 00000010 00000000


Vous conviendrez rapidement que ce langage est fastidieux et qu'il présente de nombreux risques d'erreurs. Les programmeurs possédaient une liste à laquelle ils se référaient pour ajouter au code les instructions voulues, en reportant le code binaire de cette dernière.


2 - Langages assembleurs



C'est en 1950 qu'est arrivée l'idée de remplacer ces instructions en binaire par des mots mnémotechniques plus faciles à manier, du type :

Code Assembleur
1
MOV AX, 2

Permettant simplement de déplacer 2 dans le registre AX. MOV remplace ici : 10111000, beaucoup plus simple à utiliser. Par contre ce type de programme, non compréhensible directement par le processeur exige une étape de traduction en langage machine par un interpréteur pour être compris par le processeur. Il faut savoir qu'il existe différents types de processeurs qui impliquent différents langages machine, donc différents langages assembleurs.

Celui que nous allons étudier est celui qui est lié au processeur 80x86, qui est apparu en 1978. Ce langage est aussi compréhensible par les versions plus récentes de processeur, tels que les processeurs 80186 et 80188.


3 - Langages de haut niveau


Ces langages possèdent tout d'abord un avantage particulier, en effet ils sont compatibles avec de nombreux ordinateurs, par le biais d'interpréteurs adaptés aux différents processeurs, contrairement aux langages assembleurs, de portabilité très restreinte. Ils sont de plus en plus faciles à utiliser et à comprendre. Nombre de ces langages proposent des fonctions très simples comme : printf("..."); en C ou encore : PRINT "..." en Basic permettant simplement d'afficher une chaîne de caractères. Une telle instruction est représentée en assembleur par :

Code Assembleur : Afficher une chaine de caractère
1
2
3
4
5
6

msg    DB "..."     ; Définit la chaîne de caractères à afficher

MOV DX, offset msg
; Précise l'emplacement de la chaîne de caractères
MOV AH, 9            ; Appelle la 9ème sous-fonction
INT 21h              ; De l'interruption 21h(hexadécimal) du DOS

Ne vous inquiétez pas il est normal de ne pas comprendre, nous verrons tout cela plus tard.

Ce code se traduit en langage machine par :

Code Machine : Afficher une chaine de caractère
1
2
3
4
5

11101011 00000100
00101110 00101110 00101110 00100100
10111010 00000010 00000000
10110100 00001001
11001101 00100001

Ceci représente simplement une traduction littérale du code en assembleur ci-dessus, compréhensible par le processeur. Vous constaterez donc que les langages évolués constituent un véritable "racourci" par rapport aux langages assembleurs.


B - L'assembleur 80x86



Ce langage est constitué de différents éléments faisant sa puissance :

  • un groupe d'instructions ;
  • différentes interruptions ;
  • et les registres du processeur.

1 - Les instructions


Le processeur comprend une petite série d'instructions simples, à elles seules incapables de former un programme complet :

  • Calculs basiques, additions, soustractions, multiplications, divisions, incrémentations(+1), décrémentations(-1)...
  • Comparaisons entre deux nombres
  • Manipulations de caractères, chaînes de caractères
  • Et autres...
Il est clair que ces quelques instructions ne pourraient pas combler tous les besoins d'un programme. C'est pour cela que le processeur met à notre disposition des interruptions et des registres.


2 - Les interruptions


L'ordinateur met à notre service les interruptions. Ce sont des fonctions telles qu'afficher un pixel, un caractère, envoyer des données à un des périphériques (USB, imprimante...). Il y'a deux groupes d'interruptions :

Les interruptions sont définies par des nombres hexadécimaux, que nous verrons plus tard. Le "h" à la fin des numéros repaire un nombre hexadécimal.

Interruptions
Groupe
01h à 09h Interruptions matérielles générées par les différentes cartes d'extensions et circuits auxiliaires d'un PC
10h à 20h Interruptions du BIOS : un ensemble de fonctions, contenues dans la mémoire morte (ROM) de la carte mère servant à faire des opérations basiques (écrire un caractère à l'écran, lire un secteur sur un disque, etc...)
21h à 27h Interruptions que le DOS, présent dans les PC, met à la disposition des programmes lors de leurs fonctionnement (appelé DOS API : Interface de Programmation d'Application). DOS met à notre disposition de nombreuses interruptions.
Les autres Après on trouve des interruptions plus spécialisées comme par exemple l'interruption 33h qui contient les Fonctions Gestionnaires de souris ...

Nous verrons le fonctionnement de ces interruptions plus en détail par la suite.

3 - Les registres


Le processeur contient de nombreux registres. Ce sont en quelque sorte des cases pouvant contenir un nombre. Ils ont plusieurs utilités. Ils peuvent servir à faire des opérations simplement, mais aussi à informer sur le déroulement d'un programme (emplacement du code, instructions en cours...), d'un calcul (retenu, plus grand que...). Voici les différents types de registres (nous les verrons plus en détail par la suite) :

TypeExemples
Rôles
Les registres
généraux
AX, BX,
CX, DX
Ils servent pour faire des opérations(AX, BX, DX), définir un nombre de boucles (CX) le cas échéant. Ils servent aussi à indiquer les attributs pour les interruptions
Registres de segment et d'offset
CS, DS,
ES, FS,
GS, SS...
Ils indiquent l'emplacement du code, de la pile, des données... A l'aide du segment sur lesquels ils se trouvent et des offsets (ce que nous expliquerons plus tard)
Les registres

FLAG
AF, CF, DR, IF,

OF, PF, SF...
Ils indiquent les informations suite à un calcul,

ou une comparaison

Aucun commentaire:

Enregistrer un commentaire