assembleur
TRANSCRIPT
assembleurassembleur
http://cs.nyu.edu/courses/spring07/G22.3130-001/assembly_howto.txt
Contenu du coursContenu du cours
Structure d’un programmeStructure d’un programme
Les directives
Les instructions / opérandes
Les données initialisées
Déplacer des données (MOV, PUSH )
Structure d’un programmeStructure d’un programme
Un source assembleur est une suite de lignes :
Indépendantes
Se suivant dans l’ordre
Chaque ligne peut contenir (dans l’ordre)
Un label
Une instruction/directive (+ opérandes)
Un commentaire
Le symbole « \ » seul
Les espaces/tabulations n’ont pas de sens
Structure d’un programme (2)Structure d’un programme (2)
Exemple :
Ici1: movl2 $0,%eax3 \4
#5 met A à 0
1. Le label « Ici »
2. L’instruction « movl »
3. Les opérandes « $0, %eax »
4. La rupture de ligne « \ »
5. Le commentaire « met A à 0 »
Les labelsLes labels
Tant qu’un programme n’est pas assemblé
Les instructions n’existent pas vraiment
Elles n’ont donc pas d’adresse en mémoire
On doit pourtant y faire référence :
Écriture dans une variable
Affichage d’un message
Appel d’une fonction
Nécessité de donner un nom à une ligne du programme
Naissance du label (ou encore étiquette)Naissance du label (ou encore étiquette)
Un labelUn label
Commence en première colonne
Obéit au motif [A-Za-z_.][0-9A-Za-z_.]* :
Une lettre, le caractère « _ » ou un point
Éventuellement des chiffres, des lettres, des caractères « _ » ou « . »
Se termine par un deux-points : « : »
Est unique dans tout le programme.
Exemple :Label_exemple.13 :
Les commentairesLes commentaires
Commencent par un dièse « # »
Se terminent en fin de ligne
Contiennent ce que vous voulez !
Ils sont ignorés par le compilateur
Ils ne produisent pas de code machine
Ils expliquent le programme
Le caractère « \ » seulLe caractère « \ » seul
Indique la rupture de ligne
N’est suivi d’aucun caractère
Lors de l’assemblage :
La ligne suivante sera lue
Comme la suite de la ligne courante
Exemple :movl %eax, \
$0x12345678 # gros entier
Contenu du coursContenu du cours
Structure d’un programme
Les directivesLes directives
Les instructions / opérandes
Les données initialisées
Déplacer des données (MOV, PUSH )
DéfinitionDéfinition
Une directive de compilation
Ne génère pas de code
Donne des ordres au compilateur
Ne change pas le structure du programme
Elle respecte le motif .[a-z]+ :
Un point « . »
Une ou plusieurs lettres MINUSCULES
Directives de segmentationDirectives de segmentation
.align n
Aligne les données en mémoire
Sur des paquets de n octets
Exemple : un 80386 ne peut lire un ‘long’ (32 bits) que s’il est aligné tous les 4 octets.
.data
Indique le début du segment de données
.text
Indique le début du segment de code
Directives de constantesDirectives de constantes
.byte 65,0b1100101,0101,0x41,‘A
Inscrit 5 fois le nombre 65 en mémoire
Sur 8 bits chacun
Séparés par des virgules
.quad 0x0123456789ABCDEF, 13
Inscrit de grands nombres en mémoire
Sur 64 bits
Séparés par des virgules
Directives de constantes (2)Directives de constantes (2)
.ascii "Ring the bell\7"
Stocke les caractères en mémoire
(Ici suivi du caractère N°7 : BELL)
N’ajoute pas le ‘\0’ finale (≠ .string)
.float 0f – 31415926E-7
Stocke un nombre flottant en mémoire (voir cours sur le FPU)
(ici : - )
Contenu du coursContenu du cours
Structure d’un programme
Les directives
Les instructions / opérandesLes instructions / opérandes
Les données initialisées
Déplacer des données (MOV, PUSH )
Les instructionsLes instructions
Mnémoniques du langage du processeur cible
Peuvent avoir un ou plusieurs opérandes
Génèrent du code pendant l’assemblage
Sont très nombreuses(Ne seront pas toutes étudiées !)
Exemple :
addl $4, %eax
cmpl $111, %eax
jz Boucle
Les opérandesLes opérandes
Indiquent les argument de l’instruction (ou directive) courante séparées par des virgulesPeuvent être :
Registres : %eax, %esp, %bh, …Constantes : $1, $0x24, $’A, $Question(Question étant un label)(sauf dans les directives : pas de dollar « $ »)Expressions : $(64+1), $(’B-1)(L’assembleur remplace par le résultat)Indirection : (13)(contenu de la mémoire à l’adresse 13. Pas pour les directives)
Contenu du coursContenu du cours
Structure d’un programme
Les directives
Les instructions / opérandes
Les données initialiséesLes données initialisées
Déplacer des données (MOV, PUSH )
Bases de calculsBases de calculs
Décimale : [1-9][0-9]*Mode par défaut de l’assembleurNe peut pas commencer par un zéro
Binaire : 0b[01]+
Octal : 0[0-7]*
Hexadécimal : 0x[0-9A-Fa-f]+
Les entiersLes entiers
Les processeurs ont un bus de données bien défini (aujourd’hui 32 bits et plus)On ne travaille pas toujours avec des mots de cette taille…Exemple :
260 = 1 0000 01002
En octets (8b) : 0000 00012,0000 01002
Sur 16b : 0000 0001 0000 01002
Sur 32b : 0000 0000 0000 0000 0000 0001 0000 01002
Les entiers (2)Les entiers (2)
.byte
1 octet, 8 bits
.hword, ou .short
2 octets, 16 bits
.long, ou .int
4 octets, 32 bits
.quad
8 octets, 64 bits
.octa
16 octets, 128 bits
Les flottantsLes flottants
.float, ou .singleSimple précision, 4 octets, 32 bits
.doubleDouble précision, 8 octets, 64 bits
Les FPU travaillent en fait sur 80 bitsMais échangent leurs données sur 32 ou sur 64 bits avec le processeur central.Voir cours sur le Floating Point Unit…
Les tableauxLes tableaux
Deux possibilités :
Énumération des valeurs :
.byte ‘a, ‘b, ‘c, ‘d
.short 0, 1, 2, 3, 4
Spécification de la taille :
.space 4, 25 ou .fill 4,1,25
Est équivalent à
.byte 25, 25, 25, 25
Les chaînes de caractèresLes chaînes de caractères
Deux façons de stocker une chaîne :
.ascii "Abcdefgh"
Insère les 8 premières lettres de l’alphabet
.string "Abcdefgh"
Insère les 8 lettres suivies du caractère N° 0
Le caractère 0 indique la fin de chaîne
Contenu du coursContenu du cours
Structure d’un programme
Les directives
Les instructions / opérandes
Les données initialisées
Déplacer des données (Déplacer des données (MOV, PUSH MOV, PUSH ))
Manipulation de donnéesManipulation de données
Opération de base = copie de données.
Instruction = MOV
Copie la source dans la destination
Ex :
movl $0,%eax #A0
movl $10,%ebx #B10
Movl %ebx,%eax #AB
#ici, A et B contiennent 10
Sélection de la taille des donnéesSélection de la taille des données
Dans la norme AT&T, la taille doit être indiquéeOn ajoute une lettre à l’instruction
B : Byte, 1 octetW : Word, 2 octetsL : Long Word, 4 octetsQ : Quad Word, 8 octets
Ex :movw $0, %axmovq $25, %mm0 # registre mmx
Valeur Immédiate
CS, DS, ES, FS, GS, SS
eAXeBXeCXeDXeSIeDIeBPeSP
MEMOIRE
MOV : opérations permisesMOV : opérations permises
Tous les mouvements ne sont pas permis
Exemple : Mémoire Mémoire est illégal
Les possibilités sont :
Mouvements sur la pileMouvements sur la pile
Pile = LIFO : Last In First Out
En assembleur : mémoire contextuelle
On ferme le dernier bloc ouvert
Comme des parenthèses
Deux instructions :
PUSH = empilermet une valeur sur la pile.Sur x86, le registre esp diminue
POP = dépilerretire une valeur de la pile.Sur x86, le registre esp augmente
esp
esp
Exemple de manipulation de pileExemple de manipulation de pile
movw $0x10, %ax
pushl %eax
popl %ebx
Registres
EAX EBX ESP
**** ???? 10010
Pile
**10
**10
9610**10