TP : architecture des ordinateurs
EISC1
2018-2019
Introduction à la programmation en assembleur
Ce TP reprend en partie ceux de Samuele Giraudo
Vousavez vucommentfabriqueràpartir detransistorset decondensateursunemé-
moire avec son système d’adressage et une unité arithmétique et logique (UAL). Vous
savez donc réaliser physiquement des instructions élémentaires comme : lire et écrire
en mémoire, additionner, comparer, . . . Le but de ces TP (5 séances de 2 heures) est
devousmontrercommentonpeutàpartirde ses instructionsélémentairesréaliserdes
programmes informatiques. Ses instructions seront écrites dans le langage assembleur
Nasm pourdes processeurs32 bitsd’architecture x86.
1 Premier programme
1.1 Structure d’un programme Nasm
Un programmeen Nasma lastructure suivante:
 
1global main ; declaration de main en global.
2
3segment .data
4; declarations des variables initialisees.
5segment .bss
6; declarations des variables non initialisees.
7segment .text
8; vos fonctions.
9
10main :; point dentre du programme.
11; instructions de votre programme
12
13mov ebx, 0 ; code de sortie du programme.
14mov eax, 1 ; numero de la commande exit.
15int 0x80 ; interruption Linux : le programme rend la main au systeme.
 
Voirhttps://igm.univ-mlv.fr/~giraudo/Enseignements
1
Les trois dernières lignes indiquent la fin du programme, elles devront apparaître
dans tous vos programmes. À votre avis quelle est l’utilité du point virgule en Nasm ?
Créez un fichier Hello.asm.Tapez le programme ci-dessous qui affiche le traditionnel
messageHello world.
 
1global main
2
3segment .data
4msg :
5db "Hello␣World", 10 ; declaration de la chaine de caracteres a afficher,
6; 10 est le code ASCII du retour a la ligne.
7
8segment .text
9
10main :
11; l ’affichage necessite 3 arguments
12mov ebx, 1 ; arg1, numero de la sortie pour l’affichage,
13; 1 est la sortie standard.
14mov ecx,msg ; arg2, adresse du message a afficher.
15mov edx, 12 ; arg3, nombre de caracteres a afficher.
16
17; demander au systeme d’afficher
18mov eax, 4 ; numero de la commande d’affichage
19int 0x80 ; interruption 0x80, appel au noyau.
20
21; fin du programme
22mov ebx, 0 ; code de sortie , 0 est la sortie normale.
23mov eax, 1 ; numero de la commande exit.
24int 0x80 ; interruption 0x80, appel au noyau.
 
1.2 Compilation
Vous devez compiler votre programme avant de pouvoir l’exécuter. Ouvrez un ter-
minal,se positionnerdans lerépertoire contenant lefichier Hello.asm etsaisir lescom-
mandes
 
1nasm -f elf32 Hello.asm
2ld -o Hello -melf_i386 -e main Hello.o
 
Lapremière commandecrée unfichier objetHello.o et ladernière réalise l’édition des
lienspourobtenirunexécutableHello.Pourexécuterleprogramme,ilsuffitd’utiliserla
commande./Hello.
Exercice 1. Créez et exécutez un programme qui affiche "Bonne journée !" sans re-
tourner à la ligne. Votre programme devra s’appeler Bonjour.asm et son exécutable
Bonjour.
2
1.3 Registres
Les processeurs 32 bits d’architecture x86 travaillent avec des registres qui sont en
nombrelimitéetd’unecapacitéde32bits,soit4octets.Parmicesregistres,lesregistres
appeléseax,ebx,ecx,edx,edietesisontdesregistresàusagegénéral.L’instructionmov
(déjàutiliséedansleprogrammeHello.asm)permetd’affecterunevaleuràunregistre:
 
1mov eax, 3 ; eax = 3
2mov eax, 0b101 ; eax = 0b101 = 5
3mov ebx,eax ; ebx = eax
 
Ilexisteplusieursformatspourspécifierunevaleur.Pardéfaut,lenombreestdonnéen
décimal.Unevaleur préfixéepar 0b correspondà unnombredonnéen binaire.
Exercice 2. Quelle instruction place la valeur (1000111)2dans le registre ecx?
2 Bibliothèque asm_io
Comme vous l’avez constaté avec le programme Hello.asm, l’affichage est un peu
lourd en Nasm. Afin de se simplifier la vie, nous allons utiliser la bibliothèque asm_io.
Téléchargez les fichiers asm_io.asm et asm_io.inc à l’adresse
http://igm.univ-mlv.fr/~giraudo/Enseignements/2018-2019/AO
etajoutez lesdansvotredossierdetravail.Cettebibliothèquefournitplusieursfonctions
commeprint_string, etprint_int. Voiciquelquesexplications:
1. print_string affichelachaîne decaractères(terminéepar unoctetdevaleur 0)dont
l’adresseest contenue danseax;
2. print_int affichel’entiersigné contenu danseax.
Nousallonsvoircommentlesutilisersurunexemple.Testez leprogrammeci-dessous
quevous nommereztest_biblio.asm.
 
1%include "asm_io.inc" ; importation de la bibliotheque
2global main
3
4section .data
5chaine :db "Le␣registre␣eax␣contient␣:␣", 0
6retourligne :db 10, 0
7
8section .text
9main :
10mov eax,chaine
11call print_string ; affichage de chaine.
12
13mov eax, 13
14call print_int ; affichage de la valeur du registre eax.
15
16mov eax,retourligne
17call print_string ; affichage dune nouvelle ligne.
3
18
19; fin du programme
20mov ebx, 0
21mov eax, 1
22int 0x80
 
Pourcompilervotreprogramme(quiutiliselabibliothèque)saisissezlescommandes
 
1nasm -f elf32 asm_io.asm
2nasm -f elf32 test_biblio.asm
3ld -o test_biblio -melf_i386 -e main test_biblio.o asm_io.o
 
Ilestànoterquela1re lignepermetl’obtentiondeasm_io.o etquecelle-cin’estàexécuter
qu’une seule fois pour tout le TP : en effet, une fois asm_io.o obtenu, il est inutile de le
générerà nouveau.
Exercice 3. Refaites l’exercice 1 en utilisant la bibliothèque asm_io.
Exercice 4. Faites un programme qui affiche en décimal, avec un retour à la ligne,
la valeur (10111)2.
3 Mémoire
3.1 Les sous-registres
Lesregistreseax,ebx,ecxetedxsontsubdivisésensous-registres.Lafigure1montre
la subdivision de eax en ax,ah et al. Le premier octet (celui de poids le plus faible) de
eax
ax
alah
· · · · · ·
31 1516 0
15 8 7 0
· · ·· · ·
FIGURE1 Subdivision duregistre eax.
eaxestaccessibleparleregistreal(decapacité8bits),ledeuxièmeoctetdepoidsleplus
faibleestaccessibleparleregistre ah. Les16bitsdepoidsfaiblede eax sontaccessibles
parleregistreax(qui recouvre aletah).Noter que les2octetsdepoidsfortne sontpas
directementaccessiblesparunsous-registre.Demêmepourebx,ecx,etedx,ondispose
desregistres analoguesbx,bh,bl,cx,ch,cl etdx,dh,dl.
Important. Lorsque l’on modifie le registre al, les registres ax et eax sont eux aussi
modifiés. En effet, al est physiquement une partie de ax qui lui-même est une partie de
eax.Cetteremarqueestévidementvalablepourlesautresregistresetleurssous-registres.
4
Exercice 5. Quelles sont les valeurs de eax,ax,ah et al après l’instruction mov eax,
134512768 ? Quelles sont ensuite les valeurs de eax,ax,ah et al après l’instruction mov
al, 0 ?
3.2 Adresse
Lamémoirepeutêtrevuecommeuntableaude232 casescontenantchacuneun octet.
Le numéro (ou l’indice) d’une case est appelé son adresse. La mémoire est représentée
parun tableauvertical dontlescases indexéesdela pluspetite adresseà la plusgrande.
Uneadresseestcodéesur32bits.Lecontenudesregistres32bits(commeeax,ebx,etc.)
peutreprésenterun nombre ouadresse enmémoire.
Lafigure2illustreun exemple fictifd’étatdelamémoire.Les adressesysontnotées
enhexadécimal. Adresse Valeur
0x00000000 3
0x00000001 30
0x00000002 90
0x00000003 10
0x00000004 16
0x00000005 9
......
0x00000010 127
......
0xfffffffe 30
0xffffffff 3
FIGURE2 Exemple d’état dela mémoire.
Exercice 6. (Mémoire)
1. Combien de valeurs différentes peut représenter une case de la mémoire ?
2. Quelle est la quantité de mémoire adressable sur 32 bits ?
3. Combien de cases se situent avant la case d’indice 0x0000100a dans la mémoire ?
3.3 Lecture en mémoire
Lasyntaxegénéralepourlirelamémoireàl’adresseadr etenregistrerlavaleurdans
leregistre reg estla suivante(lescrochets fontpartiede lasyntaxe):
 
1mov reg, [adr]
 
Le nombre d’octets lus dépend de la taille de reg. Par exemple, 1 octet sera lu pour
alou ah,2 octetsserontlus pourax et4 poureax. Unautreexemple:
5
1 / 12 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !