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)
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
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 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
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] regL Å [mém] 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
H L
mém mém + 1
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
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
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 Æ empiler POP Æ dépiler
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] MOVAX,[SP : BP+8] POP BP RET - 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
DI SI RET BP BP + 2 + 2 + 2 + 2
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
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
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
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 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
Conventiond’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
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.
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.
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.
émission réception horloge d’émission horloge de réception
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.
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.
Cache
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 Traitement
associatif Correspondancedirect ensemble de 2 blocsAssociatif par
ens.1 ens.2 ens.3 ens.4
A B C D C A B Adresse
virtuelle physiqueAdresse
Mémoire virtuelle Mémoire principale physique D 0 4 8 12 4 16 24 disque