Architecture
Licence Informatique - Universit´
e de Limoges
2015-2016
Semestre 4
Programmation Assembleur NASM
R´
esum´
e
1
Architecture
Licence Informatique - Universit´
e de Limoges
2015-2016
Semestre 4
Contents
1 Les bases de programmation en NASM X86 3
1.1 Cedontvousavezbesoin.................................... 3
1.1.1 T´
el´
echargerlecompilateur ............................... 3
1.1.2 CompilersousLinux................................... 3
1.1.3 CompilersousWindows................................. 3
1.2 Structure d’une programme NASM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2.1 UnelignedecodeNASM ................................ 4
1.2.2 Partitionnement du programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2.3 D´
efinir un point de d´
epart et sortir du programme (Linux) . . . . . . . . . . . . . . 4
1.3 D´
efinir des donn´
ees ....................................... 5
1.3.1 Les tailles des donn´
ees ................................. 5
1.3.2 Tout est une adresse (ou presque) . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3.3 Les variables initialis´
es ................................. 5
1.3.4 Les variables non-initialis´
ees .............................. 6
1.3.5 Lesconstantes...................................... 6
1.4 Lesregistres ........................................... 7
1.4.1 Les registres g´
en´
eraux ................................. 7
1.4.2 Les registres de contrˆ
ole ................................ 8
1.4.3 Lesregistresdesegment ................................ 8
1.5 Pr´
ecisionssurlesinstructions.................................. 9
1.5.1 Toujours utiliser au moins UN registre . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.5.2 La division enti`
ere (div,idiv).............................. 9
1.5.3 La multiplication enti`
ere (mul,imul) .......................... 9
1.5.4 Le fonctionnement de la pile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.6 Les instructions de contr ˆ
oledeot ............................... 11
1.6.1 Leslabelsetlessauts.................................. 11
1.6.2 Le bloc de boucle label ... loop label ...................... 12
1.6.3 Le bloc de proc´
edure label ... ret ......................... 12
1.6.4 Le bloc d’ex´
ecution conditionnel cmp jcc labelSi .................. 12
1.7 Les fonctions et proc´
eduresenNASM ............................. 13
1.7.1 L’effet d’une fonction sur la pile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.7.2 Le passage de param`
etre sans sauvegarde de pile . . . . . . . . . . . . . . . . . . 13
1.7.3 Le passage de param`
etre avec sauvegarde de pile . . . . . . . . . . . . . . . . . . 14
2
Architecture
Licence Informatique - Universit´
e de Limoges
2015-2016
Semestre 4
1 Les bases de programmation en NASM X86
NASM est un compilateur et un langage assembleur X86 libre et modulaire supportant une grande
vari´
et´
e de formats d’objets. Les parties suivantes r´
esument bri `
evement les bases de la program-
mation en langage NASM et sont extraites du manuel de NASM (http://http://www.nasm.us/doc/
nasmdoc0.html) que je vous incite `
a lire pour plus de d´
etails.
1.1 Ce dont vous avez besoin
Pour cr´
eer un programme assembleur NASM, il vous faut :
Le compilateur NASM
Un ´
editeur de liens
Le compilateur cr´
ee `
a partir de votre fichier monProgramme.asm un fichier objet (monProgramme.o)
similairement aux compilateurs C et C++. L ´
editeur de liens peut ensuite cr´
eer ensuite un ex´
ecutable
pour le syst`
eme voulu (en g´
en´
eral le syst`
eme sur lequel il est ex´
ecut´
e) en interfac¸ant votre programme
avec le syst`
eme.
1.1.1 T´
el´
echarger le compilateur
De nombreuses distributions Linux proposent NASM directement dans leur gestionnaire de paquets.
Pour les autres syst`
emes, vous pouvez t´
el´
echarger le compilateur sur le site http://www.nasm.us/,
dans la section ”download”. Apr`
es installation ou copie des fichiers, vous pouvez compiler via un
terminal (cmd.exe pour Windows). Si nasm n’est pas trouv´
e par d´
efaut, v´
erifiez que votre variable
d’environnement PATH contient le chemin absolu du dossier contenant l’ex´
ecutable nasm.
Pour compiler un fichier source .asm, NASM s’utilise de la fac¸on suivante :
nasm -f <format> monProgramme.asm [-g]
L’option -f permet de sp´
ecifier le format de fichier compil ´
e et -g permet de g´
en´
erer les symboles de
debug. Le fichier g´
en´
er´
e peut ensuite ˆ
etre utilis´
e dans un ´
editeur de liens.
1.1.2 Compiler sous Linux
Pour cr´
eer un programme NASM pour les syst`
emes Linux r´
ecents, vous pouvez compiler votre pro-
gramme au format ELF (”Executable and Linkable Format”) et utiliser l’ ´
editeur de liens ld :
nasm -f elf monProgramme.asm -g
ld [-m elf_i386] monProgramme.o -o monExecutable
Pour ex´
ecuter les exemples pr´
esent dans ce document (´
ecrits en assembleur X86), il est n ´
ecessaire
de passer l’option -m elf i386 ald si vous travaillez sur un syst`
eme 64 bits et que vous compiler en
format ELF (qui par d ´
efaut est en 32 bits). Vous pouvez compiler votre programme au format elf64,
mais attention : la cr´
eation d’un programme 64bits (X86 64) est diff ´
erente de celle d’un programme
32bits (X86).
Si vous d´
esirez utiliser des fonctions issus du langage C tel que printf, vous devez utiliser gcc
comme ´
editeur de liens et respecter certaines conventions d’appels pour le passage de param`
etres :
gcc monProgramme.o -o monExecutable
1.1.3 Compiler sous Windows
Pour cr´
eer un programme sous Windows, si vous poss´
edez Visual Studio, vous pouvez utiliser le linker
fournis par microsoft link.exe. Par exemple, pour cr´
eer le programme HelloWorld `
a partir du fichier
compiler HelloWorld.obj, vous pouvez utiliser la ligne de commande suivante sous Windows :
nasm -f win32 HelloWorld.asm
link HelloWorld.obj /OUT:HelloWorld.exe /SUBSYSTEM:CONSOLE /ENTRY:_start
Si vous utilisez minGW ou cygwin, vous pouvez utiliser l’ex´
ecutable ld au lieu de link.
3
Architecture
Licence Informatique - Universit´
e de Limoges
2015-2016
Semestre 4
1.2 Structure d’une programme NASM
1.2.1 Une ligne de code NASM
label: instruction op´
erandes ; commentaires
Le symbole ;correspond aux // en Langage C, pour signaler le d´
ebut d’une ligne de commentaires.
La pr´
esence d’un label (autrement appel´
e´
etiquette), est facultative devant une instruction, et sera
principalement consid ´
er´
e dans ce document :
comme d´
ebut d’un bloc de code (nomBloc:)
comme nom de variable (nomVariable[:] <type> <donn´
ee>).
1.2.2 Partitionnement du programme
Un programme assembleur est en g´
en´
eral s´
epar´
e en plusieurs parties (appel ´
ees segments). Trois
segments sont consid´
er´
es comme standard en assembleur X86 : .data,.bss et .text.
Le segment .data contient les d´
efinitions des variables initialis´
ees `
a une ou plusieurs valeurs
sp´
ecifi´
ees (instructions db, dw, dd...).
Le segment .bss contient les d´
efinitions des variables non-initialis´
ees, c’est `
a dire uniquement
allou´
ees en m´
emoire. (instructions resb, resw, resd...).
Le segment .text contient le code ex´
ecut´
e par votre programme.
En plus de ces parties, le programmeur `
a acc`
es via des instructions push et pop `
a une pile m´
emoire li´
e
au programme (Stack en anglais), souvent utilis´
ee pour le passage de param`
etres `
a des fonctions ou
sauvegarder des donn´
ees de registres avant leur utilisations (section 1.5.4).
1.2.3 D´
efinir un point de d´
epart et sortir du programme (Linux)
Le point d’entr´
ee de votre programme ne d´
epend actuellement pas de NASM, mais de l’´
editeur de liens
(ou ”Linker”) utilis´
e pour transformer le code compil ´
e en ex´
ecutable. Pour beaucoup de linker, le point
d’entr´
ee par d´
efaut est une fonction start d´
efini comme un symbole global : ce symbole sera ex-
port ´
e par votre programme pour ˆ
etre utilisable par le syst`
eme ou par d’autres fichiers compil´
es lors de
l’´
edition.
Si une fonction (ou une variable) identifi´
ee par un label est ´
egalement d´
eclar´
e comme global dans le
fichier o`
u elle est d´
efinie, cette fonction (ou variable) peut ˆ
etre appel´
ee dans un autre fichier, `
a la condi-
tion que son label soit ´
egalement d´
eclar´
e en extern dans le fichier voulant l’utiliser.
La programme suivant pr´
esente la structure ´
el´
ementaire d’un programme NASM, dans laquelle sont
incluses les instructions pour quitter un programme proprement :
global _start ; d´
eclaration de _start en global
; => export du point d’entr´
ee pour cr´
eer le programme
segment .data
; cr´
eation de variables initialis´
ees
segment .bss
; cr´
eation de variables non-initialis´
ees
segment .text
; cr´
eation de vos proc´
edures/fonctions entre le segment et le point d’entr´
ee
_start:
; instructions de votre programme
; Les 3 lignes suivantes doivent ˆ
etre `
a la fin de votre _start
mov eax,1 ; signalement de fin de programme
mov ebx,0 ; code de sortie du programme
int 0x80 ; interruption Linux : votre programme rend la main au syst`
eme
4
Architecture
Licence Informatique - Universit´
e de Limoges
2015-2016
Semestre 4
1.3 D´
efinir des donn´
ees
1.3.1 Les tailles des donn ´
ees
NASM consi`
ere les types de donn´
ee suivants :
le Byte ( 1 octet = 8 bits)
le Word ( 2 octet = 16 bits)
le Double word ( 2 word = 4 octets = 32 bits)
le Quad word (4 word = 8 octets = 64 bits)
et le exTended word ( type sp´
ecial sur 80 octets pour les r´
eels)
Les lettres majuscules de cette liste sont utilis´
ees pour d´
efinir le type de la variable d´
eclar´
ee. Cette lettre
est associ´
ee `
a un pr´
efixe pour pr´
eciser au syst`
eme si la variable doit ˆ
etre initialis´
ee (dpour ”define”) ou
juste allou´
ee en m´
emoire (res pour ”reserve”).
1.3.2 Tout est une adresse (ou presque)
Une variable NASM se comporte comme un pointeur en Langage C : la variable est une adresse
m´
emoire qui pointe vers un tableau de un ou plusieurs ´
el´
ements. Chaque donn ´
ee est accessible par
d´
er´
ef´
erencement du pointeur ou d’une adresse obtenue par d´
ecalage depuis celui-ci.
Plus g´
en´
eralement, pour acc ´
eder `
a la valeur d’une emplacement m ´
emoire point´
e par une adresse,
on utilise l’op´
erateur de d´
er´
ef´
erencement [ ]. Par exemple, pour acc ´
eder au contenu de la vari-
able/adresse var, on utilisera la notation [var] en NASM, ´
equivalente `
a la notation (*var) en langage
C et C++.
Toute ´
el´
ement d´
eclar´
e par le programmeur en assembleur est en r`
egle g´
en´
erale une adresse,
sauf exceptions des constantes.
1.3.3 Les variables initialis´
es
Lors de la d´
eclaration d’une variable initialis´
ee, l’op´
erande de droite est la valeur d’initialisation, c’est `
a
dire le contenu de la variable :
var1 db 123 ; "Define Byte" [var1] = 123, sizeof([var1]) = 8 bits
var2 dw 456 ; "Define Word" [var2] = 456, sizeof([var2]) = 16 bits
var3 dd 789 ; "Define Double" [var3] = 789, sizeof([var3]) = 32 bits
var4 dq 123 ; "Define Quad" [var4] = 123, sizeof([var4]) = 64 bits
var5 dt 1.23; "Define exTended word" [var4] = 1.23, sizeof([var5]) = 80 bits
Une variable est une adresse qui r´
ef´
erence un tableau de un ´
el´
ement, ou plus si plusieurs valeurs
(s´
epar´
ees d’une virgule) ou une chaˆ
ıne de caract`
eres sont utilis´
ees comme op´
erandes. L’instruction
times n peut ˆ
etre utilis´
ee entre le nom de la variable et l’instruction pour r ´
ep´
eter la d´
efinition d’une
valeur particuli `
ere dans la variable :
var1 db 123,12,3 ; [var1] = 123, [var1+1] = 12, [var1+2] = 3
var2 db ’Hi’,0xa ; [var2] = ’H’, [var2+1] = ’i’, [var2+2] = ’\n’ = 0xa
var3 dd 255,6554 ; [var3] = 255, [var3+1] = 6554
var4 times 4 db ’*’ ; var4 = "****"
Les 3 premi`
eres lignes peuvent se traduire en langage C par :
char var1[3] = {123,12,3};
char var1[3] = "Hi\n";
int var3[2] = {255,6554};
5
1 / 14 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 !