3
Architecture d’Ordinateurs Introduction Pratique Assembleur Introduction L’objectif de ce document est de donner les d´ etails pratiques pour ´ ecrire, compiler et ex´ ecuter les premiers programmes en Assembleur. On va travailler sur la machine sirius o` u on dispose du compilateur nasm. Pour se connecter ` a sirius, d´ emarrer l’ordinateur sous Linux. Dans la fenˆ etre “Gestionnaire de bureaux GNOME” il faut choisir Action et apr` es“Connexion distante via XDMCP”. Choisir sirius comme hˆ ote et se connecter. D’abord, il faut cr´ eer un r´ epertoire TP1_NOM_PRENOM o` u on peut cr´ eer le fichier bonjour.nasm dans lequel on va ´ ecrire nos programmes. Je vous conseille d’utiliser l’´ editeur Kate car il permet de faire la coloration syntaxique (si besoin, il faut s´ electionner ToolsHighlightingAssemblerIntel X86 nasm). Voici un premier exemple de programme qui affiche la chaˆ ıne Bonjour ! 1 global main ;ceci est un commentaire 2 extern printf 3 SECTION .data 4 bonjour : db ”Bonjour!”,10,0 ;10 =caract` ere ASCI Line Feed (le saut de ligne \ n” en C) 5 ;0 = caract` ere pour marquer la fin de chaˆ ıne (pour printf) 6 SECTION .text 7 global main 8 main : 9 push ebp 10 mov ebp , esp 11 pushad 12 13 pushad 14 push dword bonjour ; on mets l ’adresse de la chaˆ ıne dans la pile 15 call printf 16 popad 17 add esp ,4 ; pop stack (d´ epiler) une fois 18 19 popad 20 xor eax , eax ; return value =0 21 mov esp , ebp 22 pop ebp 23 ret Notons que les lignes 1-3, 6-11 et 19-23 ne doivent pas ˆ etre modifi´ ees dans les programmes que vous ´ ecrivez ensuite. Pour compiler ce programme, on va cr´ eer dans le mˆ eme r´ epertoire un fichier Makefile qui contient : all: [TAB] nasm f elf g bonjour.nasm [TAB] gcc ggdb o bonjour bonjour.o Dans ce fichier Makefile, [TAB] fait r´ ef´ erence `a la touche Tabulation. Ouvrez une console (terminal) est aller dans le r´ epertoire TP1_NOM_PRENOM qui contient ces deux fichiers (Makefile et bonjour.nasm). Tapez make pour compiler et ./bonjour pour ex´ ecuter. Modifier le fichier bonjour.nasm afin de r´ esoudre les exercices de TP1. Indications : Pour l’exercice 1 du TP1, on utilise l’instruction mov (pour mettre les valeurs de a et b dans les registres EAX et EBX), suivie par cmp (cet instruction compare deux registres – EAX et EBX – et mets le r´ esultat dans le registre flags), suivi par une instruction jle (Jump if Lower or Equal – au cas o` u le esultat stock´ e dans le registre flags indique que la valeur de EAX est inf´ erieure ` a celle de EBX, le programme effectue un saut). Pour avoir des renseignements sur une instruction, vous pourriez consulter le cours, ainsi que des ma- eriaux sur Internet, e.g. une liste d’instructions se trouve ` a en.wikipedia.org/wiki/X86_instruction_ listings TP Architecture des ordinateurs, M2 CCI, Universit´ e d’Angers – 2009-2010 Daniel Porumbel

Introduction Pratique Assembleur - Département … · Introduction Pratique Assembleur Introduction L’objectif de ce document est de donner les d´etails pratiques pour ´ecrire,

Embed Size (px)

Citation preview

Page 1: Introduction Pratique Assembleur - Département … · Introduction Pratique Assembleur Introduction L’objectif de ce document est de donner les d´etails pratiques pour ´ecrire,

Architecture d’Ordinateurs

Introduction Pratique Assembleur

Introduction

L’objectif de ce document est de donner les details pratiques pour ecrire, compiler et executer les premiersprogrammes en Assembleur. On va travailler sur la machine sirius ou on dispose du compilateur nasm. Pourse connecter a sirius, demarrer l’ordinateur sous Linux. Dans la fenetre“Gestionnaire de bureaux GNOME”il faut choisir Action et apres“Connexion distante via XDMCP”. Choisir sirius comme hote et se connecter.D’abord, il faut creer un repertoire TP1_NOM_PRENOM ou on peut creer le fichier bonjour.nasm dans lequel

on va ecrire nos programmes. Je vous conseille d’utiliser l’editeur Kate car il permet de faire la colorationsyntaxique (si besoin, il faut selectionner Tools→Highlighting→Assembler→ Intel X86 nasm).Voici un premier exemple de programme qui affiche la chaıne Bonjour !

1 g l oba l main ; c e c i e s t un commentaire2 extern p r i n t f3 SECTION .data4 bonjour : db ”Bonjour ! ” ,10 ,0 ; 10 =carac t e r e ASCI Line Feed ( l e saut de l i g n e ”\n” en C)5 ; 0 = carac t e r e pour marquer l a f i n de cha ıne ( pour p r i n t f )6 SECTION . t e x t7 g l oba l main8 main :9 push ebp10 mov ebp , esp11 pushad1213 pushad14 push dword bonjour ; on mets l ’ adres se de l a cha ıne dans l a p i l e15 ca l l p r i n t f16 popad17 add esp , 4 ; pop s t a c k ( d e p i l e r ) une f o i s1819 popad20 xor eax , eax ; re turn va lue = 021 mov esp , ebp22 pop ebp23 ret

Notons que les lignes 1-3, 6-11 et 19-23 ne doivent pas etre modifiees dans les programmes que vousecrivez ensuite. Pour compiler ce programme, on va creer dans le meme repertoire un fichier Makefile quicontient :

a l l :[TAB] nasm −f e l f −g bonjour . nasm[TAB] gcc −ggdb −o bonjour bonjour . o

Dans ce fichier Makefile, [TAB] fait reference a la touche Tabulation. Ouvrez une console (terminal) estaller dans le repertoire TP1_NOM_PRENOM qui contient ces deux fichiers (Makefile et bonjour.nasm). Tapezmake pour compiler et ./bonjour pour executer.Modifier le fichier bonjour.nasm afin de resoudre les exercices de TP1.Indications : Pour l’exercice 1 du TP1, on utilise l’instruction mov (pour mettre les valeurs de a et b

dans les registres EAX et EBX), suivie par cmp (cet instruction compare deux registres – EAX et EBX – et metsle resultat dans le registre flags), suivi par une instruction jle (Jump if Lower or Equal – au cas ou leresultat stocke dans le registre flags indique que la valeur de EAX est inferieure a celle de EBX, le programmeeffectue un saut).Pour avoir des renseignements sur une instruction, vous pourriez consulter le cours, ainsi que des ma-

teriaux sur Internet, e.g. une liste d’instructions se trouve a en.wikipedia.org/wiki/X86_instruction_listings

TP Architecture des ordinateurs, M2 CCI, Universite d’Angers – 2009-2010 Daniel Porumbel

Page 2: Introduction Pratique Assembleur - Département … · Introduction Pratique Assembleur Introduction L’objectif de ce document est de donner les d´etails pratiques pour ´ecrire,

Le programme suivant compare deux nombres a et b et affiche leur relation d’ordre.

1 g l oba l main ; c e c i e s t un commentaire2 extern p r i n t f3 SECTION .data4 a dd 10 ; a e s t un en t i e r sur 32 b i t s , sa va l eu r e s t 105 b dd 9 ; b e s t un en t i e r sur 32 b i t s , sa va l eu r e s t 96 bonjour : db ”Bonjour ! ” ,10 ,07 msgInf : db ”a<b” ,10 ,08 msgSup : db ”a>=b” , 10 , 0910 SECTION . t e x t11 g l oba l main12 main :13 push ebp14 mov ebp , esp15 pushad1617 mov eax , [ a ]18 mov ebx , [ b ]19 cmp eax , ebx20 j l i n f2122 pushad23 push dword msgSup ; on mets l ’ adres se de l a cha ıne dans l a p i l e24 ca l l p r i n t f25 popad26 add esp , 4 ; pop s t a ck ( d e p i l e r ) une f o i s27 jmp f i n ; on ne veut pas cont inuer a a f f i c h e r msgInf28 i n f :29 pushad30 push dword msgInf ; on mets l ’ adres se de l a cha ıne dans l a p i l e31 ca l l p r i n t f32 popad33 add esp , 4 ; pop s t a ck ( d e p i l e r ) une f o i s34 f i n :35 popad36 xor eax , eax ; v a l eu r de re tour du programme = 037 mov esp , ebp38 pop ebp39 ret

Pour faire tourner ce programme, il est convenable d’ecrire ce code dans le fichier bonjour.nasm et dele compiler avec la commande make. Ensuite, pour resoudre d’autre exercices, il est conseiller de travaillerque avec le fichier bonjour.nasm que vous pouvez le modifier. Informations utiles :– Observez que ce programme a plusieurs variables dans la section .data, e.g. a, b, msgInf, msgSup.Les types de donnes qu’on utilise sont : db (data byte), dw (data word) et dd (data double). Un variabledeclaree db est code sur un octet (ou une serie de plusieurs octets comme pour les variables msgIng,msgSup). Pour stocker les nombres a et b, on utilise des variables a 4 octets (dd) car les registres eax etebx ont 4 octets (32 bits). Observez que la valeur d’une variable est lue/ecrite en utilisant les crochets.Un exemple de declaration de tableau de 100 entiers de valeur 7 est monTableau : times 100 dd 7

– Les registres qu’on va utiliser le plus souvent sont : eax, ebx, ecx, edx (registres generiques) ; ebp,esp (registres utilises exclusivement pour traiter la pile d’execution du programme) ; il faut aussiconnaıtre le registre EIP (Instruction Pointer) qui represente l’adresse memoire de l’instruction cou-rante. La pile est importante quand on ecrit des sous-programmes ou des procedures.

TP Architecture des ordinateurs, M2 CCI, Universite d’Angers – 2009-2010 Daniel Porumbel

Page 3: Introduction Pratique Assembleur - Département … · Introduction Pratique Assembleur Introduction L’objectif de ce document est de donner les d´etails pratiques pour ´ecrire,

– Les principales instructions utilises dans le TP d’assembleur sont :– mov dest,src copie le contenu de src en dest. Par exemple :mov eax,[a] ; copie la valeur de a dans le registre eax– jmp etiquette fait un saut a une adresse etiquette, voir lignes 27 et 34 pour la declaration desetiquettes de saut

– cmp op1, op2 fait une comparaison entre op1 et op2 (voir ligne 19). Le resultat de cettecomparaison est stocke dans un autre registre (FLAGS) et la prochaine instruction (de saut) estcapable de lire ce resultat.

– jl etiquette fait un saut a l’adresse etiquette si la derniere comparaison a eu comme resultatop1<op2. Il y a en fait une serie d’instruction de ce type : jl(Jump if Lower), jle (Jump if Lower ofEqual), jg (Jump if Greater), etc.

– push et pop instructions pour empiler et depiler. Par exemple :

1 mov eax , 7 ; l a va l eu r 7 sera dans l e r e g i s t r e eax2 push eax ; l a va l eu r de eax (7) e s t mise au sommets de l a p i l e3 mov ebx , 9 ;4 mov ecx , 5 ;5 push ebx6 push ecx ; l a p i l e sera : 7 9 57 pop edx ; edx sera 5 e t l a p i l e : 7 98 pop eax ; eax sera 9 e t l a p i l e : 79 pop ebx ; ebx sera 7 e t l a p i l e v i de

Notons que l’instruction add esp,4 enleve pratiquement la valeur du sommet de la pile, e.g. si onajoute add esp, 4 avant pop edx, alors edx sera 9.

– call maProcedure appelle la procedure maProcedure, e.g. voir ligne 24 ou on appelle printf– ret cette instruction termine la procedure courante et renvoie la valeur de eax

– Add, Sub, Mul, Div, Inc, Dec, Shl, Sar ce sont des instructions pour des operations mathematiques.Par exemple :

1 mov eax , 7 ; eax=72 mov ebx , 5 ; ebx=53 add eax , ebx ; eax sera 124 mov ecx , 10 ;5 sub eax , ecx ; eax sera 2

D’autres exemples d’instructions arithmetiques sont disponibles a en.wikibooks.org/wiki/X86_

Assembly/Arithmetic.

TP Architecture des ordinateurs, M2 CCI, Universite d’Angers – 2009-2010 Daniel Porumbel