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