Assembleur

publicité
Assembleur
●
L'algorigramme
●
Présentation langage/environnement
●
Principales Instructions/Compilateur/Lieur C
●
Adressages
●
–
Registres
–
Mémoire
–
direct/indirect
Les Sous-Programmes
–
●
Instruction d'appel
La pile
–
type/fonctionnement
L'algorigramme
●
●
●
Aucune structure (while, for, do...while )
Comment représenter graphiquement le
fonctionnement d'un programme ?
Éléments
de l'organigramme
L'algorigramme
●
Algorigramme linéaire
L'algorigramme
●
Algorigramme : Structure alternative
L'algorigramme
●
Algorigramme : Les autres structures n'existe
pas en assembleur
L'algorigramme
●
Algorigramme : Les autres structures n'existe
pas en assembleur
Assembleur
●
Historique :
–
1954 inventé par IBM pour son 1er ordinateur
IBM701
Assemblage d'éléments simples
–
Langage B en 1969 pour PDP-7 et PDP-11
B vient de l'épouse de Ken Thompson
–
Langage C en 1972 pour réécrire UNIX
Évolution du langage B avec l'ajout des types de
données
Langage Micro-Programmer
Il faut donc adapter notre langage au binaire :
–
en réécrivant les nombres, les caractères ;
–
en créant des mnémoniques d'actions à effectuer
(MOV, ADD, ...) ;
–
en câblant des bus d'interfaces de la taille de mots
(8 bits – Binary digiT-, 16 bits, 32bits, ...)
–
en utilisant un langage simple pour l'utilisateur pour
créer des séries d'ordres compréhensibles par la
machine : l'assembleur. En écrivant avec ce
langage, on utilise les mêmes actions qu'un
processeur. Ces actions sont traduites en « langage
machine » par un compilateur.
●
Plutôt un traducteur peu ou pas du tout de
correction de syntaxe
traduction source - asm - binaire
●
●
Le compilateur transforme un programme d'abreviations en
anglais en codes machines hexadécimales
Une instruction est composée de deux éléments :
–
Le code opération : action à effectuer par le
processeur
–
Le champ opérande : donnée ou bien adresse de la
case mémoire contenant une donnée
Instruction
en
●
assembleur
Instruction Taille de
en code
l'instruction
machine
(en octets)
Descriptif de l'instruction
ADD EAX, Val
05
3
ADD AX, Adr
03 06
4
INC AX
40
1
Ajoute à AX la valeur indiquée et stocke le
résultat dans AX
Ajoute à AX la valeur stockée à l'adresse
indiquée et stocke le résultat dans AX
Incrémente AX (ajoute 1)
Partie du programme
●
Segment de text « de programme »
.text
●
Segment de données (constante)
.data
●
Segment de données variables
.bss
Partie du programme
●
Segment de text « de programme »
.text
Partie du programme
●
Segment de données (constante)
.data
●
Segment de données variables
.bss
Les types de données
●
●
Constantes
–
db data byte
-octet (8bits) / char
–
dw data word
-mot (16bits) / int
–
dd data double
- double mot (32bits) / long
Variable – Tableau
–
resb reserver un tableau d'octets
–
resw reserver un tableau de mots
–
resd reserver un tableau de doubles mots
Les types de données
●
ATTENTION AU SIGNE
●
La valeur
●
1001 1101
–
Donne 157 en non signé
–
Donne -99 en signé
IMPOSSIBILITE de connaître le signe
–
Contrairement au C : unsigned int
fonctionnement du debuggeur
●
(trace, breakpoint) rendus possibles par le
processeur (interruptions,commandes, ring 0 et
3).
L'assembleur
●
●
Sa composition:
–
Éditeur de texte (Bloc-note, ...)
–
Compilateur (nasm)
–
Éditeur de lien (gcc)
Langage minimaliste et « lisible »
–
On le surnomme : langage machine
–
Programme que vous saisissez, aura une structure
identique en mémoire : on pourra connaître
exactement sa durée d'exécution
–
Pas de fonction complexe : pas itération, pas de
gestion automatique de la mémoire ...
Commentaires
start:
call maxxy
Exemple
; Permet d’otenir le nombre de ligne et le nombre de
; colones.
shr eax,1
; En decalant, on divise par 2 le nombre de lignes...
shr ebx,1
; et le nombre de colones.
sub eax,7
; Le message fait 15 lettres, donc on soustrait 7 a eax
; pour arriver au milieu de l’ecran.
call movexy
; On deplace le curseur a cette position.
mov eax,hw
; On met l’adresse de la premiere lettre du message
; dans eax.
call write_string ; On appelle la routine d’affichage pour obtenir :
; Hello world !!!
call maxxy
; On reprend le nombre de lignes et de colones.
mov eax,0
; On met eax a 0.
dec ebx
; On soustrait un
L'assembleur
●
●
Librairie LibIUT
–
Entier
–
Caractère
–
Chaîne à zéro terminal
ENTETE - Inclure la bibliothèque
Principales Instructions
●
mov eax,0
; On met eax a 0.
●
mov eax,msg1
call write_string
; Met l'adresse de msg1 dans eax
; Ecrit à l'ecran
●
sub eax,7
; eax = eax - 7
●
dec ebx
; ebx = ebx – 1
●
jmp Etiquette1
●
...
;
saute à l'adresse de l'étiquette1
Modes Adressages
●
Par Registres
–
A, B, C, D
Instruction de déplacement « MOV »
Modes Adressages
●
Immédiat
mov eax,120", l'opérande source "120" est immédiat
●
Registres
mov eax,ebx : valeur contenue dans le registre ebx
●
Indirect
mov eax,[adresse] : Valeur contenue dans la case adresse
Principales opérations
●
add xx,yy
Additionner
●
sub xx,yy
Soustraire
●
inc xx
Incrémenter (ajouter +1)
●
dec xx
Décrémenter (soustraire -1)
●
mul xx
Multiplier
●
div xx
Diviser
Sauts
●
jmp : saut toujours
●
Sauts conditionnels en fonction de l'état du µP
–
Test du registre d'état (Satus Register)
Cmp al,0
–
(ou autre instruction)
Action conditionnée à l'etat du SR
●
Jne : jump if not equal
jne xxxxxxx
Exécuter ou non
Sauts Conditionnels
●
je/jne si egal
●
jo/jno si overflow
●
jc/jnc si carry
●
jz/jnz si egal à zero
●
jge/jnge
●
js/jns
si <0
●
jp/jnp
si pair
si >ou =
●
Étiquettes
–
Saut vers plus loin
Relatives (16bits signés / ou se trouve l'étiquette)
valable/utilisable entre deux étiquettes absolues
(plusieurs étiquettes ".sinon" correspondant à plusieurs "si ...
alors ... sinon ... finsi")
jmp .jour
....
.jour:
–
Absolues (32bits / position exacte)
endroit précis et unique de la mémoire (désigne
un et un seul endroit)
jmp
jour
...
jour :
Bibliothèque LibIUT
●
Entrée/Sortie régis par le OS
●
Clavier et écran
Les 2 fichiers nécessaires dans le dossier de
travail
–
●
–
Fichier : iut.inc
–
Fichier : libIUT.a
Aller voir la documentation en pdf
Extrait Bibliothèque LibIUT
●
●
●
re a d_c h a r : lit un et un seul caractère de la liste des
caractères tapés par l’utilisateur, et donne dans le registre 8 bits
AL, la valeur du code ASCII correspondant.
re a d_in t : lit une série de chiffres formant un entier décimal
signé (ou non) et place sa valeur dans le registre EAX.
re a d_u in t : lit une série de chiffres formant un entier décimal
non signé, et place sa valeur dans le registre EAX. En pratique
cependant, cette fonction a le même comportement que
read_int.
Extrait Bibliothèque LibIUT
●
●
●
●
●
w rite _c h a r : écrit à l’écran le caractère dont le code ASCII
a été donné dans le registre 8 bits AL.
w rite _in t : écrit à l’écran le nombre entier relatif contenu dans
le registre EAX.
w rite _u in t : écrit à l’écran le nombre entier positif contenu
dans le registre EAX.
w rite _h e x a : écrit à l’écran le contenu du registre 32 bits
EAX, sous forme hexadécimale.
w rite _s trin g : écrit à l’écran une suite de caractères terminée
par un octet nul, et dont l’adresse est donnée dans le registre
EAX.
Sous-Programme
●
Évite de dupliquer un bout de programme
●
Modularité accrue
●
Travail en équipe
●
Instructions
–
call
monSousProgramme
–
pop monregistre
–
push monregistre
–
Ret
Exemple de sous-programme
FILES
●
FIFO : First-In, First-Out : Premier entré, Premier sorti
sortie
entrée
Piles
●
LIFO : Last-In, First-Out : Dernier entré , premier sorti
PILE
●
Pointeur de pile SS et SP
–
SS (Stack Segment, dont la traduction est
segment de pile) est un registre 16 bits
contenant l'adresse du segment de pile
courant. Il doit être initialisé au début du
programme.
–
SP (Stack Pointer, littéralement pointeur de pile)
est le déplacement pour atteindre le sommet
de la pile (16 bits de poids faible).
●
PUSH : SP <- SP + 2
●
POP : SP <- SP - 2
●
Appel Sous Programme
●
Procédure
–Empilement
(pop 5)
(Prog Principal)
(SousProg)
des données à destination du sous programme
–Appel
–Dépilement
des données à destination du sous programme
(push eax ; eax = 5)
–Empilement
de l'état du processeur (des registres qui vont être
modifiés par le sous programme)
–Exécution
du sous programme
–Dépilement
de l'état du processeur (des registres pop eax)
–Empilement
des résultats à destination du programme principal
–Retour
–Dépilement
des résultats à destination du programme principal
Code assembleur :
Appel SousProg
Détails de principales structures
●
Structures alternatives (si alors sinon)
●
Faire .... Jusqu'à
●
Tant que .... Faire
Méthode : Algorigramme
●
Structure ALTERNATIVE
SI
SINON
Si eax = ebx
ALORS
Ceci
finsi
Cela
Exercice : Jour & Nuit
Si:
Si al = 'j'
Sinon:
Alors:
Afficher « vive le jour »
Afficher « vive la nuit »
Code assembleur :
Jour & Nuit
Exercice : Jour & Nuit & ERREURS
Si1:
VERS Sinon1:
Si al = 'j'
Sinon1:
Alors1:
Si2:
VERS Sinon2:
Si al = 'n'
Afficher « vive le jour »
Saut vers : finsi1
Afficher « vive la nuit »
Saut vers : finsi2
finsi2:
finsi1:
Sinon2:
Afficher « ERREUR »
Saut vers : finsi2
Tant qu'il y a des erreurs faire
Si1:
VERS Sinon1:
Si al = 'j'
Sinon1:
Alors1:
Si2:
VERS Sinon2:
Si al = 'n'
Afficher « vive le jour »
VERS : finsi1
Afficher « vive la nuit »
Sinon2:
Afficher « ERREUR »
VERS : finsi2
VERS: start
finsi2:
finsi1:
Saut vers : finsi2
Code assembleur :
Jour & Nuit & ERREUR
Code assembleur :
Début/Fin
Écrire un programme en algorigramme qui lit une suite de
caractères, un par un, en les comptant, jusqu’à un caractère
«.» qui marque la fin de la saisie. Le programme affiche
ensuite le nombre de caractères qui ont été tapés par
l’utilisateur.
Exemple : l’utilisateur tape « azerty. », l’ordinateur doit afficher
Début
ensuite « 6 lettres ».
Lire un caractère 'a'
Compter
Lire un caractère 'z'
Compter
Lire un caractère 'e'
Compter
Lire un caractère 'r'
Compter
Lire un caractère 't'
Compter
Lire un caractère 'y'
Compter
Lire un caractère '.'
Afficher le compteur
Initialiser le compteur
Lire un caractère
Si le Caractère est un '.'
Afficher le compteur
Fin
Incrémenter
le compteur
Écrire un programme en algorigramme qui lit une suite de
caractères, un par un, en les comptant, jusqu’à un caractère
«.» qui marque la fin de la saisie. Le programme affiche
ensuite le nombre de caractères qui ont été tapés par
l’utilisateur.
Exemple : l’utilisateur tape « azerty. », l’ordinateur doit afficher
Début
ensuite « 6 lettres ».
Lire un caractère 'a'
Compter
somme
Lire un caractère 'z'
Compter
somme
Lire un caractère 'e'
Compter
somme
Lire un caractère 'r'
Compter
Lire un caractère 't'
Compter
Lire un caractère 'y'
Compter
Lire un caractère '.'
Initialiser le compteur et la somme
Lire un caractère
Si le Caractère est un '.'
Afficher le compteur
Incrémenter
le compteur
Afficher la somme
Somme
Fin
Faire .... Jusqu'à
Séquence
Si:
Sinon:
Si al = 'j' ou 'n'
Alors:
Test jour ou nuit
Faire .... Jusqu'à
Séquence
Si:
Sinon:
Si al = 'j' ou 'n'
Alors:
Test jour ou nuit
Mettre le code assembleur
Tant que … Faire
Si:
Si al ≠ 'j' ou 'n'
Sinon:
Alors:
Séquence
Test Jour ou nuit
Tant que .... Faire
Si:
Si al ≠ 'j' ou 'n'
Sinon:
Alors:
Mettre le code assembleur
Séquence
Test jour ou nuit
Lancement de TP
●
Installation Compilateur : MinGW
●
Vérification de l'installation
–
●
●
PATH - Variable d'environnement pour utiliser
« gcc »
Dans le dossier du programme à compiler
–
Fichier : nasm.exe (aucune installation)
–
Fichier : iut.inc
–
Fichier : libIUT.a
Ligne de commande
nasm –f win32 exemple.asm
gcc –o exemple.exe exemple.obj –L. –lIUT
–
Créer un script avec ces 2 lignes (les rois du bash)
Téléchargement