You are on page 1of 36

Assembleur

(cours)

Architecture des ordinateurs

I. Historique

1) Les précurseurs

La création des premières machines à calculer était basée sur la technologie


des engrenages (mécaniques).

Parmi les inventeurs, il y a :


• Blaise Pascal (1623 – 1662) _ France
• Gottfried W.Phelm Leibniz (1646 – 1716) _ Allemagne
• Charles Babbage, Ada Lovelace (1792 – 1871) _ Angleterre

Jacquard : utilisation des cartes perforées (Æ machines programmables à l’aide


de cartes perforées).

Il a fallu attendre l’avènement de l’électronique pour mettre en pratique les


idées théoriques développées par les précurseurs.

En 1936 : machine de Zuse (électromécanique)


En 1940 : machine de George Stibitz (Laboratoires Bell)
En 1944 : le Mark I, université de Harvard Ai Ken avec IBM

Ces machines étaient dépassées avant même d’être construites ; au même


moment des chercheurs travaillaient sur la technologie des tubes à vide.

2) Première génération de calculateurs (1937 – 1955)


Tubes à vide

1937 : machine ABC de Atanasoff - Berry (Iowa State University)


1943 : Colossus, machine construite en Angleterre ; décodage des messages
allemands
1944 : Von Neumann étudiait le stockage des programmes sous forme
numérique avec Eckert et Mauchly :
EDVAC (=Electronic Discrete Variable Automatic Computer) = projet
de Von Neumann
1946 : ENIAC (= Electronic Numrical Integrator And Calculator), construite à
l’université de Californie :
30 mètres de long ; 2,5 m de haut ; chacun des 20 registres de 10 chiffres
avait 60 cm de long ; 18000 tubes à vide ;
la programmation se faisait manuellement en enfichant des câbles et en
positionnant des interrupteurs
1949 : Maurice Wilkes (Cambridge)
ETSAC qui fut la première machine à programmes enregistrés de
grande envergure.
Un prototype appelé le Mark I fut construit à l’université de Manchester
en 1948
1951 : Eckert et Mauchly ont construit l’UNIVACI (vendu à 48 unités)
1952 : l’EDVACI est opérationnel
1953 : 1ère machine d’IBM : IBM 701 (vendu à 19 unités)

3) Deuxième génération : transistors (1955 – 1965)

1948 : invention des transistors (Laboratoires Bell)


1961 : PDP 1 de DEC
1963 : B5000 de Bunaighs (architecture à pile) supportait les langages de haut
niveau comme l’ALGOLqui utilisait un système d’explication écrit dans
un langage de haut niveau
1964 : IBM devient n°1 avec l’IBM 7094 et l’IBM 1401 (calculateur pour gestion)

4) Troisième génération : circuits intégrés (1965 – 1980)

1964 : IBM 360 : 1ère famille d’ordinateurs à architecture commune.


CDC 6600 créé par Control Data : le 1er ordinateur pipeline
(parallélisme).
1965 : PDP 8 de DEC
1970 : PDP 11 de DEC
1978 : VAX, un seul système d’exploitation VHS, succès pendant 10 ans.

5) Quatrième génération (1980)

1980 : retour d’une architecture plus simple (Bakcley).


Ditzel et Patterson ont étudié l’idée d’ordi à jeu d’instructions réduit
(RISC).
Idée conservée par CRAY – CRAY I
1981 : PC d’IBM
1984 : Apple lance son Macintosh
1987 : Sun fournit des machines basées sur l’architecture SPARC (RISC)
1993 : Power PC
II. Architecture à microprocesseur

1) Architecture de Von Neumann

Cette machine se compose :


• d’une unité centrale (de contrôle) qui supervise le
fonctionnement de la mémoire
• d’une unité de calculs
• d’une unité d’échange (entrées / sorties)
• d’une mémoire finie

2) L’unité centrale

C’est elle qui exécute les instructions. Elle comporte des registres qui sont des
zones privilégiées de stockage de l’information (données et instructions).
Cette information sera codée dans ces registres par une suite de 0 et de 1.
8086 registres de 16 bits
80386 registres de 32 bits

Ces registres sont utilisés pour stocker :


• Les instructions arithmétiques et logiques
• L’adresse de la prochaine instruction à exécuter
• L’adresse en mémoire d’une donnée (constante stockée en mém.)

3) La mémoire

La mémoire à pour première raison d’être de fournir des registres


supplémentaires. Cette mémoire, tout comme les registres de l’unité centrale,
ne contient de façon réelle que des nombres (0 ou 1) Æ tout ce que manipule la
machine de Von Neumann doit avoir un format numérique qu’il s’agisse de
programmes ou de données (pas de distinction intrinsèque entre instruction
de programmes ou de données).

Dans la mémoire les 0 et les 1 sont regroupés par 8 (octets).


Capacité de la mémoire = nombre d’octets (1 Ko = 2^10 octets ; 1 Mo = 2^20
octets ; 1 Go = 2^30 octets).
Les octets sont considérés comme contigus et numérotés de 0 à N-1 (adresse
physique) si la mémoire est de taille MAX.
On appelle "mot mémoire" l’unité d’accès à la mémoire Æ taile des registres
du processeur.
On a plusieurs façons de coder les infos en mémoire :
Æ binaire
Æ DCB (décimal codé binaire
Æ code ASCII
Æ virgule flottante

La mémoire est décomposée en mémoire morte (qui contient le jeu


d’instructions de base du processeur) et en mémoire vive = RAM (qui contient
le programme que l’on désire exécuter).

4) Les entrées / sorties

Elles permettent l’interaction avec l’homme à travers les appareils dits


périphériques :
• Clavier
• Ecran
• Mémoire de masse (= mémoire externe), c-à-d disque dur, disquettes,
CD, …) Æ fonction de stockage de l’information. Elle possède un
caractère permanent par opposition avec la mémoire vive qui garde les
infos de façon temporaire.

5) Les bus

Ce sont des fils de communication entre l’unité centrale (U.C.), la mémoire et


les entrées / sorties :
• Bus des données Æ transporte la valeur de l’octet
• Bus d’adresse Æ fixe l’adresse de l’octet à accéder en mémoire
centrale
• Bus de contrôle Æ fixe le sens de l’échange

6) Les instructions

C’est ce qui forme le jeu d’instruction du processus :


• Instructions arithmétiques
• Instructions logiques de transfert
• Instructions de contrôle (boucle, conditionnelle)

- Architecture RISC (jeu d’instruction réduit)


- Architecture CISC (jeu d’instruction complet)
1°) recherche de l’instruction en mémoire centrale ; l’adresse est indiquée par
le compteur cardinal
• L’U.C. renvoie l’adresse de l’instruction sur le bus d’adresse et
demande une lecture sur le bus de contrôle
• La mémoire dépose la valeur contenue à cette adresse sur le bus de
données, la valeur est lue par l’U.C.
2°) décodage
• L’U.C. détermine l’instruction correspondant à la valeur lue (code) sur
le bus des données
3°) recherche de l’opérande
même principe que 1°)
4°) exécution
L’instruction n’est exécutée que si tous les opérandes sont présents ; le
résultat est gardé dans l’U.C.
Simultanément l’U.C. calcule l’adresse de la prochaine instruction à
exécuter.
5°) écriture du résultat en mémoire
principe :
• Valeur déposée sur le bus de données
• Adresse déposée sur le bus d’adresse
• Ecriture demandée sur le bus de contrôle
III. Intel 80x86 (Pentium)

Circuit intégré du type VLSI.


Le 8086 est le processeur 16 bits qui est à l’origine des Pentium (donc utilisé
initialement dans tous les PC).

1) Les registres

Les registres généraux :

• AX : 16 bits
(Subdivisé en deux registres 8 bits : AH, AL)
Accumulateur (contient en particulier les résultats)
• BX (BH, BL)
Registre de base , sert souvent de registre d’adressage
• CX (CH, CL)
Compteur (dans les instructions de répétition)
• DX (DH, DL)
Registre de donnée , c’est une extension de l’accumulateur

• Sur 32 bits on a l’équivalent : EAX, EBX, ECX, EDX

Les registres d’adressage (ou registres pointeurs) :

• BX
• BP
Pointeur de base (travaillé dans la pile)
• SI, DI
Registres d’index (mémoire)
• SP
Indique le sommet de la pile

Les registres de segment :

• CS
Pointeur du segment de code
• DS
Pointeur du segment de donnée
• SS
Pointeur du segment de pile
• ES
Autre segment de donnée
Les registres de contrôle :

• IP : Pointeur d’instruction (compteur ordinal)


• SF : Indicateur de signe
• ZF : Indicateur du zéro
• CF : Indicateur de retenue
• OF : Indicateur de dépassement de capacité
• PF : Indicateur de parité
• IF : Indicateur d’interruption
• TF : pas à pas
• AF : retenue auxilliaire

IV. Mémoire centrale du 80x86

Les adresses des octets de la mémoire sont codées sur 20 bits (mode réel).
Mais les registres étant sur 16 bits, l’espace adressable est de 2^16 octets (64
Ko). Ceci était la limite du Dos pendant longtemps.

La mémoire centrale est divisée en segments toujours à cause de la taille des


registres. Chaque segment aura une taille limitée à 64 Ko (8086).
L’adresse du début de segment sera un multiple de 16.

Il y aura 2^16 segments possibles qui peuvent se chevaucher (ces segments


environnent tous les 16 octets).

Il y a 4 types de segments :

• Le segment de code :
Repéré par le registre CS.
Il contient les instructions en cours d’exécution. Il contient
l’adresse dans le segment de code de la prochaine instruction à
exécuter.

• Le segment de pile :
Repéré par le registre SS.
Il contient les données temporaires structurées sous forme d’une
pile.
Le sommet de cette pile est indiqué par le registre SP.
Le registre BP permet de travailler dans le pile (Æ on peut
prendre des choses au milieu de la pile !).

• Le segment des données :


Repéré par le registre DS.
Il contient les données permanentes du programme.
Les registres BX, SI, DI travaillent par défaut dans ce segment.
• Les segment des données supplémentaires :
Repéré par le registre ES.

L’ADRESSAGE :

• adresse physique : codée sur 20 bits


• adresse logique : 3 systèmes d’adressage :
sur le 8086 : Mode réel
sur le 80286 : Mode protégé
sur le Pentium : Mode protégé et mode virtuel

Le mode réel :

Les impératifs de compatibilité ont conduit à représenter l’adresse 20 bits à


partir de 2 mots de 16 bits.
On a besoin d’un couple de valeurs :
N° de segment : sur 16 bits
Déplacement dans le segment : n° de l’octet dans le segment

On note : seg : dép

ex : 154F : 6254 Æ 154F0 ‘déplace de 4 à gauche car *16


+ 6254

1B744 Å adresse physique

segment x 16
adresse
déplacement physique
V. Les instructions

Format général des instructions :

Code opération mode déplacement valeur


(1) (2) (3) (4)

(1) : type de l’opération à exécuter


(2) : méthode de calcul à l’adresse des opérandes
(3) : déplacement à ajouter à l’adresse (8 ou 16 bits)
(4) : valeur d’une constante (8 ou 16 bits)

Les instructions ont une taille variable de 1 à 6 octets.


En pratique on utilise les mnémoniques :
Codop Dest, Source

Codop : opération à exécuter


Dest : argument destination (registre, zone mémoire)
Source : argument source

Ex : MOV AX, BX Æ transfert du contenu du registre BX dans le registre AX,


plus parlant que 89D8.

Adressage des opérandes :


Æ spécifie où se trouvent les opérandes.

Cela peut être :


• des constantes
• se trouver dans les registres
• en mémoire

Lorsque ces opérandes sont en mémoire, on a différents modes d’adressage :

a) adressage direct :

ex : MOV AX, [1000] ; entre [] = adresse sous forme de cste

adresse effective : 1000


adresse logique : DS : 1000 ‘ DS par défaut
adresse physique : DS x 16 x 1000 ‘ x 16 car en hexa
b) adressage indirect :

L’opérande est en mémoire. Son adresse effective est contenue dans un


registre pointeur.

ex : MOV AX, [BX] ; [] donc on est dans la mémoire

adresse effective : BX
adresse logique : DS : BX
adresse physique : DS x 16 x BX

c) adressage basé et indexé :

ex : MOV AX, [BX + DI + 1000]


MOV AX, [SI + 1000]

adresse effective : somme des contenus d’un registre de base


d’un registre d’index et d’un déplacement : SI + 1000
adresse logique : DS : [SI + 1000]
adresse physique : DS x 16 x [SI + 1000]

d) adressage immédiat :

ex : MOV AX, 12

e) adressage direct :

ex : MOV AX, [1000] ÍÎ MOV AX, [DS : 1000]


; 1000 = déplacement dans DS

Les instructions de transfert autorisées :

• transferts de registres généraux à registres généraux


• transferts de registres généraux à mémoire
• transferts de registres généraux à registres pointeurs de segments

• transferts de registres pointeurs de segment à registres généraux


• transferts de registres pointeurs de segment à mémoire

• transferts de mémoire à registres généraux


• transferts de mémoire à registres pointeurs de segments

• transferts valeur immédiate à mémoire


• transferts valeur immédiate à registres généraux
Les transferts interdits :

• transferts de mémoire à mémoire


• l’affectation d’une valeur immédiate à un registre pointeur de segment

Les transferts immédiats :

Il est nécessaire de spécifier le type de transfert (16 bits ou 8 bits)

MOV BYTE [mem], val ‘transfert 8 bits


MOV WORD [mem], val ‘transfert 16 bits

Transfert 16 bits :

MOV reg,[mém]
regH Å [mém + 1] mém
regL Å [mém] mém + 1
H L

MOV [mém],reg
[mém + 1] Å regH
[mém] Å regL

VI. Les instructions arithmétiques

2 types d’opérations sur 2 nombres :

opération à 2 opérandes (1)


opération à 1 seule opérande (2)

(1) Si l’instruction a 2 opérandes, ils occupent le but et la source. Après


l’exécution de l’opération, la valeur initiale du but est remplacée par le
résultat.

ADD but, source ; but Å but + source


SUB but, source ; but Å but – source
but = registre ou emplacement mémoire si la source est un registre
source = soit une valeur ; soit un registre ; soit un emplacement mémoire

(2) Si l’instruction est à un seul opérateur, l’opérande est considéré comme


source et le but est le registre AX. Dans ce cas AX reçoit avant l’exécution de
l’opération un des 2 arguments, puis reçoit après exécution le résultat de
l’opération.

MUL source ; source = registre

(8 bits) AX Å AL * source
(16 bits) (DX, AX) Å AX * source

DIV source

(8 bits) AH Å AX % source
AL Å AX / source
(16 bits) DX Å (DX, AX) % source
AX Å (DX, AX) / source

Cas particulier : (n’utilisant pas AX)


INC but ; but Å but + 1
DEC but ; but Å but – 1

but : registre ou emplacement mémoire.

VII. Les instructions logiques

3 instructions :
AND but, source ; but Å but et source
OR but, source ; but Å but ou source
XOR but, source ; but Å but ou exclusif source
VIII. Les comparaisons
(instruction à 2 opérandes)

CMP but, source

Æ compare but et source en faisant une soustraction


Æ met à jour les indicateurs
Æ ne change pas les valeurs de but et source

but : registre ou emplacement mémoire


source : registre, emplacement mémoire à une valeur

IX. Rupture de séquence, branchements, sauts

Les instructions sont exécutées de façon séquentielle par la mise à jour du compteur
cardinal (IP). Cette séquence est rompue lors de l’exécution de sauts.

1) sauts inconditionnels

JMP adr

adr : adresse de la prochaine instruction à exécuter

IP Å adr

Adressage relatif CS par défaut


100 MOV AX , 00
104 MOV BX, 61
108 MOV CX, 64
MUL CX
DIV CX
JMP 0100

Adressage direct :

JMP seg : dép

2) sauts conditionnels

La rupture n’a lieu que si une condition est vérifiée.

Syntaxe générale :
Jcond adr

cond porte sur les indications (CF, SF, ZF, OF)


si la condition n’est pas vérifiée, l’exécution continue en séquence.

• test d’égalité :
JE Æ si ZF = 1 (=)
JNE Æ si ZF = 0 (!=)

• test d’ordre :
codage binaire vrai :
JA CF = 0 et ZF = 0 (>)
JB CF = 1 et ZF = 0 (<)
JAE CF = 0 et ZF = 1 (>=)
JBE CF = 1 et ZF = 1 (<=)

Codage complément à 2 :
JG ZF = 0 et SF = OF (>)
JL SF != OF (<)
JGE SF = OF (>=)
JLE ZF = 1 et SF != OF (<=)

Ces instructions sont souvent associées à CMP.

• Test des indicateurs :


JZ ZF = 1
JNZ ZF = 0
JC CF = 1
JNC CF = 0
JS SF = 1
JNS SF = 0
JO OF = 1
JNO OF = 0

LOOP (boucle)

LOOP adresse (utilise CX par défaut)

Æ décrémente CX
Æ teste si CX est nul, sinon va à l’adresse indiquée par l’argument.

Si CX est nul, passe à l’instrction suivante.

ex: MOV CX,BX


105 INC AX
LOOP 105
MOV CX,AX
X. La pile

Ensemble de mots mémoire utilisés pour stocker les valeurs temporaires.


Progression de la pile = dans le sens inverse de la mémoire.
Sommet de la pile SS : SP
BP : registre pointeur travaillant dans la pile.

2 opérations :

PUSH
POP
Æ empiler
Æ dépiler } modifie contenu de SP.

1°) PUSH [mem]


PUSH reg ; reg : registre 16 bits

Si BP = SP ; SP = sommet de la pile
DEC BP Î PUSH AX
DEC BP
MOV [BP], AX

PUSH décrémente SP après l’exécution (SP Å SP – 2).

2°) POP reg


POP [mem]

MOV AX, [BP]


INC BP Î POP AX
INC BP

POP incrémente SP après l’exécution (SP Å SP + 2).

Utilisation : - sauvegarde des registres


- passage de paramètres

Ex : PUSH AX
PUSH BX
PUSH CX ; sauvegarde des registres AX, BX, CX dans la pile

Instructions modifiant AX, BX, CX

POP CX
POP BX
POP AX
Exécution de sous-programmes :

2 instructions :

CALL
RET

CALL déroute l’exécution vers la 1ère instruction du sous-programme en


compilant l’adresse de retour.
RET retourne à l’instruction qui suit le CALL en déroutant l’exécution dont
l’adresse est au sommet de la pile.

Ex : CALL adr RET adr


SP Å SP – 2 IP Å [SS : SP]
[SS : SP] Å IP SP Å SP + 2
IP Å adr

Traduction d’une fonction écrite en langage de haut niveau, en langage machine.

Ex : i = xor(i,j)

En langage machine : PUSH DI ; paramètre j


PUSH SI ; paramètre i
CALL XOR
POP CX
POP CX
MOV SI,AX ; récupération du résultat

L’accès aux paramètres à l’intérieur de la fonction :

PUSH BP
MOV BP,SP
MOV BX,[SP : BP+6] BP
BP +2
MOVAX,[SP : BP+8]
RET +2
POP BP
SI +2
RET
DI +2

- passage de paramètres :
Les paramètres sont placés sur la pile par l’appelant ainsi que l’adresse de
retour (provoqué par l’instruction CALL).
Toutes ces infos sont dépilées au retour par l’appelant.
- Traduction du RETURN
Les valeurs sont retournées dans le registre AX si on est en 16 bits, dans le
registre DX,AX si on est en 32 bits.

XI. Principe des interruptions


La machine de Von Neumann repose sur une boucle infinie :

Démarrage
.1 Attente commande
Enregistrement commande
Exécution commande
Retour .1

Pendant que le processeur exécute une commande, il rafraîchit l’écran dans les
1/50e de seconde Æ principe du temps partagé.
La machine possède une horloge couplée au processeur ; à intervalles réguliers,
l’horloge rappelle au processeur en envoyant des signaux qu’il faut interrompre la
tâche qu’il exécutait et appelle le gestionnaire d’écran pour lui demander de
rafraîchir l’image.

2 types d’interruptions :

• Celles déclenchées par un signal (matérielles)


• Celles qui sont programmées ou programmables (logicielles)

Les Interruptions logicielles

Utilisées pour appeler des sous-programmes appartenant au système


d’exploitation. On utilise un n° correspondant à une entrée dans la table des
interruptions.

INT numéro

numéro : entrée dans la table d’interruption contenant l’adresse du sous-


programme.

Sauvegarde dans la pile de :

• L’adresse de retour (CS : IP)


• Les indicateurs

SP Å SP – 2
[SS : SP] Å indicateurs
SPÅ SP – 2
[SS : SP] Å CS
SPÅ SP – 2
[SS : SP] Å IP
IP Å table d’interruptions[numéro]
IRET

Discute l’exécution vers une instruction dont l’adresse est donnée dans la pile.
Le registre des indicateurs est remis en place.

IP Å [SS SP]
SP Å SP + 2
CS Å [SS SP]
SP Å SP + 2
Indicateurs Å [SS SP]
SP Å SP + 2

La table des interruptions se situe à l’adresse 0000 : 0000, adresse physique 0.

interruptions
matérielles
(BIOS) BIOS= Basic Input / Output System

interruptions DOS DOS = Disk Operationg System

Réservé

Disponibles

Les interruptions matérielles :

0 division par zéro


1 pas à pas
3 point d’arrêt
4 dépassement de capacité
5 impression d’écran
8 horloge
9 clavier
B communication
C
D disque dur
E disquette
F imprimante
10 écran
Les interruptions DOS :

20 fin du programme
21 appel à DOS
23 CTRL BREAK
24 erreur fatale
25 lecture d’un secteur disque
26 écriture d’un secteur disque

INT 21

Permet l’exécution des fonctions système :

• lecture du clavier
• affichage
• gestion des fichiers

pour indiquer la fonction à exécuter

• déposer un code dans le registre AH (ex : 2 pour l’affichage)


• dépasser les paramètres nécessaires dans les registres DL ou DX

ex : MOV DL, 41h


MOV AH, 2
INT 21h

Affiche le caractère 41 à l’écran.


En retour, le registre AH contiendra un code indiquant si l’opération s’est
bien déroulée.
1: lecture
2A : lecture de la date
2C : lecture de l’heure
4C : fin du programme
9 : affichage d’une chaîne

L’ASSEMBLEUR

Un macro assembleur NASM


Æ facilite la conception des programmes
Æ les rend plus lisibles

Les macro assembleur introduisent des directives qui sont des ordres donnés au
macro assembleur et remplacent les adresses hexa par des adresses
symboliques (labels).
Æ fait ressembler les macro-assembleurs à des langages de "haut niveau".
[LABEL :] [OPERATEUR OPERANDE] [ ; COMMENTAIRES]
Les directives ou pseudo-instructions

Ordres donnés au macro-assembleur, elles ne créent pas de code. (ce ne


sont pas des instructions du processeur.)

a) les constantes : par défaut elles sont exprimées en décimal


MOV AX, 10

• en hexadécimal, elles doivent débuter par un chiffre et être suivies


par le caractère H ou précédées par 0x .
MOV AX, 0Ah
ou
MOV AX,0x0A
• en binaire, elles sont suivies du caractère B
MOV AH, 0001010b
• en ASCII, un caractère est représenté par le caractère entre
apostrophes
MOV AH, ‘A’

b) déclaration de constantes symboliques :


EQU

Ex : DOS EQU 33
longueur EQU $_message

$ : position de début de la ligne suivante

c) déclaration de données initialisées :


DB , DW

Ex : Réservation d’un octet initialisé à 10 :


octet1 DB 10
labels
Réservation d’un mot :
mot 2 DW 0FBh

Réservation de tableaux et de chaînes :


message DB ‘hello’
message DB ‘h’, ‘e’, ‘l’, ‘l’, ‘o’
nombres DW 12, 10, 5
tab 1 DW 41h , 60, 60

Rq : le label correspond à l’adresse du 1er élément de la zone mémoire


d) déclaration de données non initialisées :
RESB , RESW

Ex : octet RESB 1 ; réservation d’un octet


buffer RESB 64 ; réservation de 64 octets
mot RESW 10 ; réservation de 10 mots

e) duplication : TIMES
duplique des instructions ou des données

tab 10 TIMES 10 db 0 ; 10 octetsinitialisés à zéro


tab 256 TIMES 256 dw 0
; réservation de 256 mots initialisésà zéro
buffer db ‘hello’ TIMES 64 - $ + buffer db ‘’ ; ayant des nbres
nécessaires d’espaces pour que le buffer contienne 64
octets

TIMES peut également s’appliquer à des instructions :

Ex : TIMES 100 movsb ; répète 100 fois movsb


; movsb copie l’octet se trouvant dans [ES DI] dans la
case indiquée par [ES SI] et incrémente DI et SI (en
fonction de DF indicateur de direction)

f) accès aux zones mémoires déclarées par DB, DW, RESB, RESW :

Il suffit d’encadrer le nom de la zone mémoire par des crochets. Le nom


désigne l’adresse du 1er élément de la zone.

Ex : WordVar dw 1, 10, 11, 12


MOV AX, [WordVar] ; AX contient 1
MOV AX, [WordVar + 2] ; AX contient 10
MOV AX, WordVar ; AX contient l’adresse du 1er élément

La structuration des programmes :

Elle se décompose en plusieurs segments logiques :


• la définition des données
• le code sous forme d’une suite d’instructions
a) la directive segment permet de définir dans quel segment mémoire le
code sera assemblé.
Dans certains cas, les noms des segments sont fixés (langage C).
On utilisera :
• .text pour le segment code
• .data pour le segment de données initialisées
• .bss pour le segment de données non initialisées

ex : SEGMENT .bss
int var resw 1
SEGMENT .text
..start

..start : définit le point d’entrée dans le programme (point où l’on


commence l’exécution).

b) initialisation des registres pointeurs de segment :

• le registre DS doit être explicitement initialisé

SEGMENT data

SEGMENT code
..start : mov ax, data
mov ds, ax

• le registre CS est implicitement initialisé

• le registre SS

SEGMENT stack
Resw 64
SEGMENT code
..start : mov ax, stack
mov SS, ax

Groupement des segments logiques :

Æ regroupement dans un seul segment physique

GROUP G1 SEG1, SEG2


GROUP dgroup .data, .bss
La programmation modulaire :

Comme en JAVA ou en C, il est possible de diviser un programme en


plusieurs fichiers.

En NASM on a 2 directives :
GLOBAL et EXTERN

• GLOBAL :
Indique que certains symboles peuvent être accessibles à un autre
module.

SEGMENT data
GLOBAL MemVar, Tableau 1
MemVar DW 10
Tableau 1 RESP 100

SEGMENT code
GLOBAL Proc
Proc1 :
(…)
RET

• EXTERN :
Utilisé pour rendre les labels d’autres modules accessibles à un module
donné.

SEGMENT data
EXTERN MemVar Word, Tableau 1 BYTE

SEGMENT code
EXTERN Proc1

MOV AX, [MemVar]


MOV BX, Tableau 1
Call Proc1

On empile séparément les fichiers : (dans MSDOS)

Nasm –f obj Princ.asm


Nasm –f obj Routine.asm
Tlink princ+Routine
Le processeur de Nasm : Définition de macro

Nasm permet de définir des petits modules utilisables dans le code assembleur.

(1) Macro à 1 ligne :


% défini

Ex : % défini param (a, b) ((a) + (a) * (b))


MOV byte [param (2, bx)], ‘D’

Sera réécrit en :

MOV byte [(2) + (2) * (bx)], ‘D’

Ex : % défini a(x) 1 + b(x)


% défini b(x) 2 * x
MOV ax, a(8)

Sera réécrit en :

MOV ax, 1 + 2 * 8

(2) Macro à plusieurs lignes :


% macro nom nb_paramètres

Ex : % macro prologue 1 ; % 1 désigne le 1er paramètre


Push bp ; % 2 désigne le second
max bp, sp
sub sp, % 1
% end macro
mafct : prologue 12

ce qui correspond à :

mafct : push bp
mov bp, sp
sub sp, 12

XII. Initiation au langage C

Langage à la syntaxe similaire au langage JAVA :


• Même déclaration des variables
• Même instruction d’affectation
• Même instructions de contrôle

Mais ne contient pas de notion de classe et a une vraie notion de procédure.

1) Organisation générale d’un programme C

#include <stdio.h> /* déclaration des fonctinos d’E/S */


/* déclaration des fonctions et procédures */
/* programme principal */

main ( )
{
}

ex : #include <stdio.h>
main ( )
{
printf (« hello word ») ;
}

2) Déclaration des fonctions et procédures

a) fonctions :

correspond à la notion de fonction static en JAVA.

Type nom_fct (liste_des_paramètres_en _entrée)


{
(…)
return résultat ;
}

ex : int calcul (int i, int j)


{
int res ;
res = i + j ;
return res ;
}

b) les procédures :
void nom_proc (liste_des_paramètres_en_entrée_et_sortie)
{
}

Les paramètres de sortie : passage par adresse


Fournir à la procédure le n° de la case mémoire où se trouve la valeur à
utiliser.

S’écrit en C à la déclaration de la procédure :


Type * nom_variable

Ex : void échange (int *a, int *b)


{
int temp ;
tem = *a ;
*a = *b ;
*b = temp ;
}

A l’appel :
Indiquer les paramètres passés par adresse & nom_variables.

Ex : main ( )
{
int x, y ;
x=4;
y=5;
échange (&x, &y)
} /* après l’appel : x = 5 et y = 4 */

XIII. C et assembleur

Convention d’appel des fonctions et procédures en C :

• Passage des paramètres :


Les paramètres sont placés sur la pile par le programme appelant, les
paramètres sont empilés dans l’ordre inverse de leur déclaration. Toutes
ces informations sont ensuite dépilées par l ‘appelant.

• Déclaration des variables locales :


Placées dans SI et DI puis dans la pile.

• Traduction du « return » :
Dans le registre AX si on est en 16 bits, dans les registres DX, AX si on est
en 32 bits.
Ex : c = xor (i, j)
Push di ; valeur de j
Push si ; valeur de i
Call xor
Pop cx
Pop cx
Mov si, ax return
i
Dans la fonction la pile aura la configuration suivante : j

L’aide aux paramètres se fait grâce à BP :


Push BP
Mov BP, SP
Mov bx, [BP + 4]
Mov ax, [BP + 6]

Ex : void lire ( )
{
int i, j, h, l ;
SI et DI pile
}

Push BP
Mov BP, SP
Sub SP, 4
Mov [BP – 2], 6 ;k=6
Mov SI, 3 ;i=3

XIV. Les entrés – sorties

Permet les échanges d’information entre l’ordinateur et son environnement


(imprimante, modem, disques, …). Chaque boîtier externe comporte des
registres (ports) qui permettent de les piloter. Ces registres ont des adresse
codées sur 16 bits fixées par le concepteur du système. Le processeur peut lire
et écrire sur ces registres à l’aide d’instructions spéciales d’E/S.

1) instruction de lecture

IN AL, DX

DX : indique l’adresse des registres d’E/S à lire


AL : contiendra la valeur lue sur ce registre externe
2) instruction d’écriture

OUT DX , AL

DX : adresse du registre d’E/S


AL : valeur à écrire sur le registre externe dont l’adresse est dans DX.

3) les interruptions matérielles

Elles sont provoquées par les boîtiers externes pour signaler au processeur un
événement et lui permettre de le traiter.

Les signaux d’interruptions :

µproc.
Æ RESET
Æ NMI
Æ INTR
Å INTA

• RESET
Il force les registres aux valeurs suivantes :
CS Å 0FFFFh
IP Å 0
DS Å 0
SS Å 0
ES Å 0

A l’adresse physique FFFF0 se trouve un JUMP vers la 1ère instruction


du programme de chargement.

• NMI
Evénements exceptionnels (erreur de parité, mémoire, …). Le
processeur termine l’instruction en cours, sauvegarde les indicateurs,
CS et IP sur la pile et exécute l’interruption 2.

• INTR
Evénements liés aux E/S.
Le processeur termine l’instruction en cours, sauvegarde les
indicateurs, CS et IP sur la pile et exécute la routine d’interruption dont
le n° est déposé sur le bus de données et envoie un signal
d’acquittement (INTA) lorsque l’interruption est autorisée (IF = 1) ;
4) Le boîtier contrôleur d’interruption 8259

gère les priorités entre les différents événements externes et assure l’interface
avec le processeur en fournissant le n° de l’interruption sur le bus de données.

5) Masquage d’interruption globale

STI ; autorise les interruptions


CLI ; interdit les interruptions

6) Masquage d’ interruption individuelle

Le processeur peut masquer ou démasquer les interruptions individuellement


en programmant un registre de contrôle du 8259.

Masquage :
Mov dx, 21h ; registres des masques
IN al, dx ; lecture
Or al, 01 ; masquage de l’ interruption 1
OUT dx, al ; écriture

Démasquage :
Mov dx, 21h
IN al, dx
And al, Feh ; démasquage de l’ interruption 1
OUT ax, al

Accès au vecteur d’interruption

MOV AL, num


MOV AH, 35h
INT 21h
En retour ES : BX contient l’adresse logique correspondant à la routine num.

7) Le son

Pour produire un son, un programme devra faire vibrer la membrane du haut-


parleur à la fréquence exigée par la note voulue.

Ex : le LA sera obtenu avec une fréquence de 440 Hertz (440 vibrat°/sec.)

Un PC peut produire des fréquences de 1 à 1 000 000 Hz mais nous ne


percevons que les fréquences entre 20 et 20 000 Hz.

Le haut-parleur dispose d’un port d’E/S (61h) à travers lequel on peut


indiquer si la membrane doit se mouvoir en avant ou en arrière.
Le contrôle s’effectue par les 2 bits de poids faible du port 61h (bit 0 et bit 1).
Le bit 1 active ou désactive le haut-parleur.
Le bit 0 détermine si le haut-parleur reçoit un signal d’horloge.

Pour générer un son, on peut :

• Activer ou désactiver plus ou moins rapidement le haut-parleur (la


fréquence dépend de la vitesse d’impulsion).

• Soumettre le H-P à un signal d’horloge en utilisant le boîtier 8253


(timer).
Æ transmission au 8253 des vibrations du cœur du PC (un oscillateur
qui produit 1 193 180 impulsions par seconde).

• Dire au 8253 qu’il doit commencer à générer un signal cyclique dès que
l’intervalle entre 2 signaux lui aura été communiqué.
On envoie la valeur 182 sur le port 43h du 8253.

• Communiquer l’intervalle sur le port 42h.


L’intervalle de temps est calculé à l’aide de la formule suivante :
compteur = 1 193 180 / fréquence
Cette valeur est stockée sur 16 bits mais ne peut être transformée que
sur 8 bits.
On fait le transfert en 2 temps :
Transfert des poids faibles
Transfert des poids forts

Transmission des données : couche physique


4 notions à distinguer :

(1) la liaison physique câblage :


fil électrique, câble blindé, paires torsadées, …

connecteur ligne connecteur

(3) le codage des informations sous forme binaire :


à chaque caractère on associe une suite précise d’éléments binaires : le
nombre de bits utilisés pour coder un caractère est le nombre de moments
du code.
Un code à n moments permet de coder 2^n caractères distincts.

Ex : . le code télégraphique a 5 moments (32 caractères)


. le code ASCII à 7 moments (128)
. le code ASCII à 8 moments (256)
(4) Mode de transmission :

Deux types de transport : série ou parallèle.


La succession de caractères peut se faire de 2 façons :
le mode synchrone ou asynchrone

(5)Le protocole de transmission (couche liaison) c’est-à-dire les règles qui


définissent le dialogue entre émetteur et récepteur.

a) la transmission parallèle
Les données sont échangées caractère par caractère.
Tous les bits sont transmis simultanément grâce à l’utilisation d’un fil
par bit.
Cette méthode pose des problèmes de synchronisation qui conduisent à
ne l’utiliser que sur de très courtes distances (bus d’un ordinateur,
imprimante,…).

Les cas du PC :
Un PC autorise jusqu’à 4 ports // , certains ports permettent des
transferts bidirectionnels.
Le BIOS fournit un service d’imprimante spécial, l’INT 17 qui permet
d’initialiser l’imprimante, de récupérer l’état de celle-ci et de lui
envoyer des données.
Les 2 principaux ports // ont leur adresse d’E/S en 278h et 378h.

Protocole de transmission :
- 0,5 µs après l’envoi des données : Stroboscope se met à 0 et ça va
provoquer la mise à 1 de « occupé ».
- dès que le périphérique a traité l’octet, la ligne d’accusé est
positionnée à 0 pendant 0,5 µs au minimum.
- dés que la ligne « accusé » repasse à 1, la ligne « accusé » repasse à 1,
la ligne « occupé » est remise à 0 pour recevoir un autre octet. Le débit
max. théorique est de 500 Ko/s mais dans la pratique, étant donnés les
retards de réponse des périph. On a un taux de transfert d’environ 150
Ko/s.

b) La transmission série
Les différents bits sont transmis successivement sur le même fil. Une
liaison série peut être synchrone ou asynchrone.

1°) mode synchrone


L’émetteur et le récepteur se mettent d’accord sur un intervalle
constant qui se répète dans le temps.
Les bits sont envoyés les uns derrière les autres et sont synchronisés
avec le début des intervalles de temps.
émission

réception

horloge d’émission

horloge de réception

Les caractères sont émis en séquence sans aucune séparation.


Ce mode est utilisé dans le cas d’un très fort débit.

2°) mode asynchrone


- pas de relations préétablies entre l ‘émetteur et le récepteur
- les bits d’un même caractère sont entourés de 2 signaux :
l’un concernant le début de la transmission (bit START) et
l’autre de fin (bit STOP).

Le début d’une transmission peut se faire à un instant quelconque


de temps.

START STOP

Au repos la ligne est un niveau électrique 1.


Pour débuter une transmission, le bit START est à 0 (la ligne est
mise à 0 pendant la durée d’un bit.

c) la vitesse de transmission :
Le signal émis est synchronisé sur une horloge lorsqu’un élément
binaire est transmis.
La vitesse de l’horloge donne le débit de la ligne en bauds (nombre de
tops d’horloge par seconde).

Ex : une ligne de communication à 50 bauds indique qu’il y a 50


intervalles de temps élémentaires par seconde.

Généralement sur un intervalle de temps élémentaire on émet 1 bit (0


ou 1). On parle de bit/ seconde.
On pourrait envoyer 2 informations sur un intervalle de temps
élémentaire. Dans ce cas on dira que le signal a une valence de 2.

Ex : une ligne de vitesse 50 bauds qui a une valence de 2 a une


capacité de 100 bits/ seconde.
d) La transmission en bauds de base :
Comment un émetteur peut envoyer un signal que le récepteur
connaîtra comme étant 1 ou 0 ? :

code tout ou rien


0 1 1 0 0 1 0

code NRZ (Non Return to Zero)

code bipolaire

Le bit 1 est indiqué par un courant positif ou négatif à tour de rôle.


Le bit 0 est indiqué par un courant nul.

Code bipolaire à haute densité

0 1 1 0 0 1 0

Æ permet de ne pas laisser le courant nul pendant les suites de 0.

Des suites spéciales de remplissage (--, 0, +) sont insérées à la place de


ces 0. Un nouveau 1 est indiqué par un courant positif ou négatif en
violation avec la suite de remplissage. Les 2 derniers codes permettent
d’éviter les courants continus souvent très difficiles à faire passer entre
2 stations.

e) La modulation
La transmission en bauds de base ne peut être utilisée que sur de courtes
distances (moins de 5 km) car le signal, s’il n’est pas régénéré, se
dégrade avec la distance parcourue.
Sur une longue distance on utilise un signal de forme sinusoïdale.
Pour moduler le signal on utilise un modem (modulateur /
démodulateur).

Ex :
f) La détection d’erreurs (couche liaison)

Pour permettre la détection d’erreurs on a 2 possibilités :

• Envoyer l’information en redondance (correction directe)


• Utiliser un code de détection d’erreur

Dans la plupart des cas c’est la 2ème solution qui est choisie : détection
d’erreur et retransmission de la trame (donnée).

Principe : copie des trames

Retour d’acquittement

Emission
Emetteur Récepteur

A chaque acquittement négatif la trame est retransmise. Une façon de


détecter les erreurs consiste à ajouter au caractère transmis un bit de
parité. Il est positionné de façon à ce que la somme des éléments
binaires modulo 2 soit égale à 0 si bit de parité pair (ou à 1 si bit de
parité impair).

XV. Compléments sur les mémoires

1) SRAM et DRAM

Il existe 2 technologies pour la réalisation de mémoire dynamique (DRAM) et la


mémoire statique (SRAM).

Les SRAM sont plus rapides mais plus chères. Les mémoires se présentent
physiquement sous la forme de barrettes : les SIMM (= Single Intime Memory
Modules) .
Pour obtenir une mémoire rapide capable de suivre la cadence du processeur on
doit construire une hiérarchie de mémoire.

Chacune des mémoires aura une plus grande capacité que la précédente mais un
accès moins rapide.
Cette hiérarchie se base sur 2 principes :

• Le principe de localité :
La donnée la plus récemment utilisée sera accédée dans un futur
proche Æ un programme n’accède pas à tout le code et à toutes les
données de manière uniforme.
• Les caractéristiques de coût/ performance des technologies
mémoire.
But : fournir un système mémoire presque aussi bon marché que le
niveau le plus bas et aussi rapide que le niveau le plus haut.
Registres Æ mémoire cache Æ mémoire interne Æ disque

2) 1er niveau de hiérarchie : la mémoire cache

Principe :

La mémoire est divisée en « blocs » ; un bloc est l’unité minimale


d’information qui peut être prescrite dans le cache.
C’est dans cette mémoire que l’on chargera les données intervenant
souvent, en se basant sur le principe de localité.
Æ l’accès à ces éléments sera plus rapide.

a) placement de bloc

Trois façons de charger un bloc à une seule place possible dans la


mémoire cache :
• cache à correspondance directe :
chaque bloc a une seule place possible de la mémoire cache
(n°bloc mod nbre_de_blocs_dans_le_cache)
• cache totalement associatif :
un bloc peut être placé n’importe où dans le cache.
• Cache associatif par ensemble de blocs :
Généralement par ensemble de 2 ou 4 blocs. Un ensemble est un
groupe de blocs dans le cache. Un bloc est affecté à un ensemble
de blocs puis placé n’importe où dans l’ensemble.

b) remplacement de bloc

Si un échec intervient, le contrôleur de cache doit choisir un bloc à


remplacer par la donnée dérivée.
• En correspondance directe :
Un seul bloc est testé pour déterminer si la donnée est présente, et
seul ce bloc peut être remplacé.
• En placement associatif total ou par ensemble :
Il faut choisir entre plusieurs blocs.
Deux stratégies possibles :

- le hasard : les blocs candidats sont choisis de façon aléatoire.


- le plus ancien (LRU : Least Recently Used) : le bloc remplacé
est celui qui n’a pas été utilisé depuis le plus longtemps.

Traitement Correspondance Associatif par


associatif direct ensemble de 2 blocs
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7

Cache

ens.1 ens.2 ens.3 ens.4

3) La mémoire virtuelle

Avant quand un programme devenait trop grand pour la mémoire interne, le


programmeur avait la responsabilité de le faire tenir en mémoire.
Il divisait le programme en morceaux mutuellement exclusifs. Ces morceaux
étaient chargés et déchargés à l’exécution sous le contrôle du programmeur
utilisateur (OVERLAYS).
La mémoire virtuelle fut inventée pour éviter ce travail.
Dans la mémoire virtuelle l’espace d’adressage est divisé en pages. Si l’U.C.
veut accéder à un élément d’une page absente du cache ou de la mémoire
interne, un défaut de page intervient et la page entière est transférée des
disques dans la mémoire interne.

Adresse Adresse
virtuelle physique
0 A
4 B C 4
8 C
12 D
A 16
Mémoire virtuelle

B 24

Mémoire principale
physique

D disque