Architecture en couches
couches inférieures
Inférieures
1
27/05/2016
ADD (add)
Langage assembleur
2
27/05/2016
3
27/05/2016
…
Exemple :
Les paramètres de l’instruction courante
…
4
27/05/2016
5
27/05/2016
Segment de données:
Segment de données: Pour données non initialisées
Définir une constante: la directive equ
Débute par : .bss
B W D label: equ valeur
Utiliser la directive : resX
1 octet 2 octets 4 octets Répéter instruction (l’assembler) ou déclaration: la directive
Réserver … times
label: times nbr_fois instruction
Exemples: Exemples:
i1: resb 60 ; reserver 60 octets nombre: equ 30
i2: resw 1 ; reserver 1 mot label: times 100 db 0 ; 100 fois l’octet 0x00 (100 emplacements
mémoire initialisés à 0)
label: times 100 resb 1 ; la meme chose que label: resb 100
6
27/05/2016
Tout microprocesseur contient un jeu d’instructions basiques se L’assembleur permet de contrôler le CPU d’une manière directe.
résumant à une tâche simple: (additionner la valeur x avec la valeur y,
mettre la valeur x dans la mémoire,…) Bonne maîtrise du système
L’assembleur :
Programmes rapides par rapport aux langages haut niveau
convertir
Insertion des bouts de codes assembleur dans des programmes
Les instructions du un fichier source
microprocesseur sous la (Pascal, C, …)
forme de mnémoniques
La communication entre les programmes et le CPU est assurée par
les REGISTRES
Le code numérique binaire un fichier exécutable
de chaque instruction
Assemblage Assemblage
Un programme en assembleur
L’assemblage : transformer le programme écrit en langage
doit subir un certain nombre de transformations avant l’exécution d’assemblage en instructions machine en créant un fichier objet
Différentes étapes du traitement nasm -f <format> <filename> [-o <output>]
.asm Exemples :
Fichier assembleur source
nasm -f elf monfichier.asm Assembler le fichier
Traduction (compilateur)
.obj monfichier.asm en un fichier objet ELF (executable and
Fichier Objet (Lng Machine)
linkable file format / contient le code compilé) monfichier.o
Utilitaire LINK ou TLINK (Edition des liens)
Fichier exécutable .exe
Ajuster les adresses des
Résultats différentes procédures
7
27/05/2016
Il faut lier le fichier objet avec les bibliothèques dont il dépend Elément de
mémoire
ld -e main monfichier.o -o monfichier
Stockage
• Adresses Capacité
réduite
• Résultats
Le programme débute avec une procédure "main".
intermédiaires
Besoin d'utiliser gcc pour créer l’exécutable
effectuer des traitements logiques Effectuer des opérations sur les registres
…
8
27/05/2016
Registres d’offset
Registres généraux: AX, BX, CX, DX Registres généraux: AX, BX, CX, DX
9
27/05/2016
Registres généraux: AX, BX, CX, DX Registres généraux: AX, BX, CX, DX
Registres généraux: AX, BX, CX, DX Registres généraux: AX, BX, CX, DX
Exemple: Pour répéter 12 fois une instruction en assembleur
DX: Registre de Données
1 Mettre la valeur 12 dans CX
sert à stocker des données destinées à des fonctions
Ecrire l'instruction précédée d'une étiquette [son adresse en
2
mémoire] le registre propre aux manipulations des données
3 Faire un LOOP à cette adresse Par exemple
Lorsque le processeur reconnaît l'instruction LOOP, il sait que le
4 Ecrire une chaîne de caractères à l'écran
nombre d'itérations à exécuter se trouve dans CX
Il se contente alors de décrémenter CX, de vérifier que CX Il faut placer l'offset de cette chaîne dans DX avant
5 est différent de 0 puis de faire un saut (« jump ») à l'étiquette
mentionnée. d'appeler la fonction appropriée
Si CX vaut 0, le processeur ne fait pas de saut et passe à
6
l'instruction suivante.
10
27/05/2016
Registres de segment: CS, DS, ES, SS Registres de segment: CS, DS, ES, SS
Taille: 16 bits
La mémoire est découpée en morceaux
Surtout sur DOS besoin de stocker des nombres de 0 à 1
Chaque morceau contient un certain nombre
048 575 Besoin de 20 bits
d'informations
Combiner 2 registres : 1 des registres avec 1 des 4 registres
utilisés pour stocker l’adresse de début d’un segment:
de segment former une adresse de 20 bits
l’adresse du début des instructions du programme
Exemples:
l’adresse du début des données
CS et IP: combinés CS:IP accéder à la prochaine
l’adresse du début de la pile
instruction à exécuter sous la forme CS:IP
Registres de segment Indiquer le segment de la
SS et SP: combinés SS:SP toutes les opérations
mémoire utilisée par chaque partie du programme
concernant la pile
Registres de segment: CS, DS, ES, SS Registres de segment: CS, DS, ES, SS
11
27/05/2016
Registres de segment: CS, DS, ES, SS Registres de segment: CS, DS, ES, SS
Par exemple, pour copier des données d'un segment vers un autre
Registres d’offset: IP, SI, DI, BP, SP Registres d’offset: IP, SI, DI, BP, SP
12
27/05/2016
Registres d’offset: IP, SI, DI, BP, SP Registres d’offset: IP, SI, DI, BP, SP
La pile est gérée en LIFO : dernier entré premier sorti. PUSHa : empiler les registres : AX, BX, CX, DX ainsi
Le nombre des registres est limité Utiliser la pile lorsqu’on que les registres SP, BP, SI et DI.
Registres d’offset: IP, SI, DI, BP, SP Registres d’offset: IP, SI, DI, BP, SP
13
27/05/2016
Registres d’offset: IP, SI, DI, BP, SP Registres d’offset: IP, SI, DI, BP, SP
14
27/05/2016
Valeur de l’opérande
J = Jump if (Saut si)
Valeur de l’opérande
…
…
15
27/05/2016
Instruction Action Effectuer des tests entre des valeurs et modifier les flags
cmp arg1, arg2 Comparer les 2 opérandes, si égaux ZF = 1
suivant le résultat
jp / jnp sauter si pair (PF=1) / impair (PF=0) Le fonctionnement du CMP est semblable à SUB.
jc/ jnc sauter si retenue (CF=1) / (CF=0)
Exemple:
je / jne sauter si ZF de cmp est égal à 1/ (ZF = 0)
jo / jno sauter si dépassement (OF=1) / (OF=0) CMP AX, BX vérifier si les valeurs MOV AX, 9
MOV BX, 8
jb / jbe sauter si cmp retourne plus petit que (CF =1) / (CF=1 or AX et BX suite au résultat de: AX-BX JMP somme
ZF =1)
suite:
ja/ jae sauter si cmp retourne plus grand que (CF=0 and ZF=0) si AX-BX= 0 ZF=1
MOV BX,AX
/ (CF =0)
sinon ZF=0 ...
… … somme:
ADD AX, BX
JMP suite
16
27/05/2016
Nombre décimal: forme habituelle ou un ‘0d’ comme 0X ou ‘0h’ ou ajouter un ‘h’ comme suffixe avec un 0 au début
préfixe ou un ‘d’ comme suffixe (avec un ‘0’ au début) lorsqu’on veut pas le confondre avec la chaine de caractères.
Nombre octal: un ‘q’ ou ‘o’ comme suffixe / ‘0q’ ou
En base 10, écrire 564:
‘0o’ comme préfixe
Chaine de caractère: suite de caractères 564 = 5*100 +6*10 +4*1 = 5*(10^2) +6*(10^1) + 4*(10^0)
Le processeur central (CPU) ne travaille qu’en binaire, notation Une interruption: un programme exécuté quand un
en base 2 (bits) évènement particulier se produit (exemple: branchement
En assembleur, le suffixe ‘b’ ou ‘y’ est utilisé pour les nombres d’une clé USB, …) et dont l’exécution cause l’interruption
binaires ou ajouter un ‘0b’ ou ‘0y’ comme préfixe du programme en cours
Par exemple 9 s'écrira: Une interruption est appelée avec: INT constante
17
27/05/2016
Interruptions Interruptions
Types:
Le programme en cours est interrompu pour gérer des
événements imprévus nécessitant une réponse rapide interruptions logicielles: appelées directement par le
programme
le contrôle passé au gestionnaire d’interruptions
l’extérieur
interruptions externes: proviennent de l'extérieur du
interruptions internes: soulevées depuis le processeur Entrées: données envoyées par un périphérique vers l’unité
centrale.
Les interruptions erreur: sont appelées aussi traps
Sorties: données émises par l’unité centrale vers un
périphérique.
18
27/05/2016
L’unité d’E/S assurer les liaisons entre bus internes / MOV: l'instruction la plus basique mov dest, src
externes
Déplacer les données d'un emplacement à un autre
19
27/05/2016
mul src
div src
Décalage Rotation
décaler d'un côté ou de l'autre les bits des registres + remplir les Décalage avec le même principe + les bits qui sortent d'un
positions des poids les plus faibles par 0 côté rentrent de l'autre.
Décaler un nombre binaire d'un chiffre à gauche le multiplie
0001110000
par 2.
0011100000 (rotation à gauche)
Effectuer un décalage n fois donne une multiplication par 2n
0111000000
Permettre la division par 2n par une rotation à droite
1110000000
110011 (décalage gauche) 100110
1100000001
1000000011
20
27/05/2016
Action
Un sous-programme
read_int lecture de l’entier entré au clavier
le stocker dans eax
permet d'effectuer un ensemble d'instructions à travers
read_char lecture du caractère entré au clavier
stocker son code ASCII dans eax un simple appel de la procédure.
print_int afficher à l’écran la valeur de l’entier contenu dans eax
Simplifier le code
print_char afficher à l’écran le caractère dont le code ASCII est
stocké dans al
Minimiser la taille du programme
print_string afficher à l’écran le contenu de la chaîne de caractères
à l’adresse stockée dans eax.
21
27/05/2016
22
27/05/2016
Procédures Procédures
Gestion de la pile:
Passer les paramètres, deux manières:
L’instruction PUSH A:
Passer les paramètres par pile :
SP SP -2
comme les langages de haut niveau
[SP] valeur du registre A (16 bits)
1/ Placer la valeur des paramètres un à un sur la pile
L’instruction POP A:
2/ Appeler la procédure
Registre destination A [SP]
3/ Nettoyer la pile (restaurer la pile)
SP - 2
SP SP + 2
SP Stockage des valeurs dans la pile avec PUSH
Procédures Procédures
À la fin de la procédure rendre à SP la valeur initiale On peut accéder aux paramètres depuis partout dans le sous-
programme par: [BP + décalage (par rapport à SP]
avant l'empilement des paramètres.
• Param3 est accessible depuis [BP+4], Param2 est accessible
depuis [BP+6] et Param3 est accessible depuis [BP+8]
23
27/05/2016
Procédures Procédures
Changement de l’état de la pile:
Syntaxe unifiée
myprocedure PROC Après terminaison du sous-programme
Procédures Fonctions
push ax
push bx empiler les paramètres
Même principe que les procédures
push dx
call myprocedure avec valeur de retour
…
Ex: Fonction récursive
myprocedure
push bp calculer la somme des entiers de 1 à n
mov bp, sp
;lecture des paramètres
pop bp
ret 6
myprocedure endp
…
24
27/05/2016
Fonctions Fonctions
fonction:
Variables = zones mémoire
push bp ; empiler la valeur originale de bp
Les variables peuvent être stockées dans le segment de mov bp, sp ; bp = sp
données (comme c’est déjà vu) sub sp, 4 ; 2 variables locales de 2 octets
Variables locales ...
peuvent être stockées dans la pile mov sp, bp ; désallouer les variables locales
Économiser la mémoire pop bp ; restaurer la valeur de bp
Stockées après la valeur de bp sauvegardée dans la ret
pile.
Fonctions Macros
25
27/05/2016
Macros Tableaux
Tableau en assembleur
Dans le code compilé
%macro MyMacro
MyMacro
%macro MACRO [ adresse1 + taille*indice ]
Avec:
; instructions
adresse1: l’adresse du 1er élément dans le tableau
ENDM MyMacro
%endmacro
indice: l’indice de l’élément concerné
Tableaux Tableaux
Exemple:
26