Diapositives sur l`assembleur

publicité
Assembleur
INF1600: Architecture des
micro-ordinateurs
Assembleur
Introduction à IA-32
Responsable du cours : Giovanni Beltrame
[email protected]
Local: M-4109
Chargée de cours:
Luiza Gheorghe
[email protected]
Génie informatique et génie logiciel
1
H2015
3
Assembleur
Conventions du C
• Les variables globales sont dans la section .data
• Les variables locales et paramètres sont sur la pile
– En C les paramètres sont empilés de droite à gauche avant le ‘call’ (dépilés au
retour du ‘call’)
– L’espace pour les variable est alloué au début de la sous-routine
– On utilise souvent %ebp pour pointer vers ces variables/paramètres
• La valeur de retour
– Dans %eax pour les entiers (char/short/int…) et pointeurs (edx:eax pour 8 octets)
– Dans %st(0) pour les float/double (registres larges pour operations point flotant)
– En mémoire pour les objets/structures
• Le pointeur où placer le résultat est donné par la routine appelante
• Registres qu’ une routine peut modifier: %eax, %ecx, %edx
– Doit sauver/restaurer les autres si on les modifies
Génie informatique et génie logiciel
2
H2015
Assembleur
La pile – paramètres, valeurs, variables
Cadre pile procedure 1
(stack frame)
Génie informatique et génie logiciel
3
H2015
Assembleur
La pile – l’instruction swap
void swap(int *xp, int *yp)
{
int t0 = *xp;
int t1 = *yp;
*xp = t1;
*yp = t0;
}
swap:
pushl %ebp
movl %esp,%ebp
pushl %ebx
movl
movl
movl
movl
movl
movl
12(%ebp),%ecx
8(%ebp),%edx
(%ecx),%eax
(%edx),%ebx
%eax,(%edx)
%ebx,(%ecx)
movl -4(%ebp),%ebx
movl %ebp,%esp
popl %ebp
ret
Génie informatique et génie logiciel
prologue
corps
(code,
etc)
epilogue
4
H2015
Assembleur
void swap(int *xp, int *yp)
{
int t0 = *xp;
int t1 = *yp;
*xp = t1;
*yp = t0;
}
Offset
Variable
yp
xp
t1
t0
yp
8
xp
4
ad. ret.
ancien
%ebp
ancien
Génie informatique et génie logiciel
-4
movl
movl
movl
movl
movl
movl
Pile
12
0
Registre
%ecx
%edx
%eax
%ebx
•
•
•
12(%ebp),%ecx
8(%ebp),%edx
(%ecx),%eax
(%edx),%ebx
%eax,(%edx)
%ebx,(%ecx)
%ebx
# ecx
# edx
# eax
# ebx
# *xp
# *yp
=
=
=
=
=
=
%ebp
yp
xp
*yp (t1)
*xp (t0)
eax
ebx
5
H2015
Adresse
Assembleur
pushl %ebp
movl %esp,%ebp
pushl %ebx
%eax
0x124
456
0x120
0x11c
0x118
Offset
%edx
%ecx
%ebx
0x114
yp
12
0x120
0x110
xp
8
0x124
0x10c
4
Ad ret
0x108
%esi
0
%ebp
%edi
0x104
-4
%esp
%ebp
123
0x104
movl
movl
movl
movl
movl
movl
12(%ebp),%ecx
8(%ebp),%edx
(%ecx),%eax
(%edx),%ebx
%eax,(%edx)
%ebx,(%ecx)
Génie informatique et génie logiciel
#
#
#
#
#
#
ecx
edx
eax
ebx
*xp
*yp
0x100
=
=
=
=
=
=
yp
xp
*yp (t1)
*xp (t0)
eax
ebx
6
H2015
Adresse
Assembleur
123
0x124
456
0x120
0x11c
%eax
0x118
Offset
%edx
%ecx
0x120
%ebx
yp
12
0x120
0x110
xp
8
0x124
0x10c
4
Ad ret
0x108
%esi
0
%ebp
%edi
0x104
-4
%esp
%ebp
0x114
0x104
movl
movl
movl
movl
movl
movl
12(%ebp),%ecx
8(%ebp),%edx
(%ecx),%eax
(%edx),%ebx
%eax,(%edx)
%ebx,(%ecx)
Génie informatique et génie logiciel
#
#
#
#
#
#
ecx
edx
eax
ebx
*xp
*yp
0x100
=
=
=
=
=
=
yp
xp
*yp (t1)
*xp (t0)
eax
ebx
7
H2015
Adresse
Assembleur
123
0x124
456
0x120
0x11c
%eax
0x118
%edx
0x124
%ecx
0x120
Offset
%ebx
yp
12
0x120
0x110
xp
8
0x124
0x10c
4
Ad ret
0x108
%esi
0
%ebp
%edi
0x104
-4
%esp
%ebp
0x114
0x104
movl
movl
movl
movl
movl
movl
12(%ebp),%ecx
8(%ebp),%edx
(%ecx),%eax
(%edx),%ebx
%eax,(%edx)
%ebx,(%ecx)
Génie informatique et génie logiciel
#
#
#
#
#
#
ecx
edx
eax
ebx
*xp
*yp
0x100
=
=
=
=
=
=
yp
xp
*yp (t1)
*xp (t0)
eax
ebx
8
H2015
Adresse
Assembleur
123
0x124
456
0x120
0x11c
%eax
456
%edx
0x124
%ecx
0x120
0x118
Offset
%ebx
yp
12
0x120
0x110
xp
8
0x124
0x10c
4
Ad ret
0x108
%esi
0
%ebp
%edi
0x104
-4
%esp
%ebp
0x114
0x104
movl
movl
movl
movl
movl
movl
12(%ebp),%ecx
8(%ebp),%edx
(%ecx),%eax
(%edx),%ebx
%eax,(%edx)
%ebx,(%ecx)
Génie informatique et génie logiciel
#
#
#
#
#
#
ecx
edx
eax
ebx
*xp
*yp
0x100
=
=
=
=
=
=
yp
xp
*yp (t1)
*xp (t0)
eax
ebx
9
H2015
Adresse
Assembleur
123
0x124
456
0x120
0x11c
%eax
456
%edx
0x124
%ecx
0x120
%ebx
0x118
Offset
123
yp
12
0x120
0x110
xp
8
0x124
0x10c
4
Ad ret
0x108
%esi
0
%ebp
%edi
0x104
-4
%esp
%ebp
0x114
0x104
movl
movl
movl
movl
movl
movl
12(%ebp),%ecx
8(%ebp),%edx
(%ecx),%eax
(%edx),%ebx
%eax,(%edx)
%ebx,(%ecx)
Génie informatique et génie logiciel
#
#
#
#
#
#
ecx
edx
eax
ebx
*xp
*yp
0x100
=
=
=
=
=
=
yp
xp
*yp (t1)
*xp (t0)
eax
ebx
10
H2015
Adresse
Assembleur
456
0x124
456
0x120
0x11c
%eax
456
%edx
0x124
%ecx
0x120
%ebx
0x118
Offset
123
yp
12
0x120
0x110
xp
8
0x124
0x10c
4
Ad ret
0x108
%esi
0
%ebp
%edi
0x104
-4
%esp
%ebp
0x114
0x104
movl
movl
movl
movl
movl
movl
12(%ebp),%ecx
8(%ebp),%edx
(%ecx),%eax
(%edx),%ebx
%eax,(%edx)
%ebx,(%ecx)
Génie informatique et génie logiciel
#
#
#
#
#
#
ecx
edx
eax
ebx
*xp
*yp
0x100
=
=
=
=
=
=
yp
xp
*yp (t1)
*xp (t0)
eax
ebx
11
H2015
Adresse
Assembleur
%eax
456
%edx
0x124
%ecx
0x120
%ebx
movl -4(%ebp),%ebx
movl %ebp,%esp
popl %ebp
ret
0x124
123
0x120
0x11c
0x118
Offset
123
0x114
yp
12
0x120
0x110
xp
8
0x124
0x10c
4
Ad ret
0x108
%esi
0
%ebp
%edi
0x104
-4
%esp
%ebp
456
0x104
movl
movl
movl
movl
movl
movl
12(%ebp),%ecx
8(%ebp),%edx
(%ecx),%eax
(%edx),%ebx
%eax,(%edx)
%ebx,(%ecx)
Génie informatique et génie logiciel
#
#
#
#
#
#
ecx
edx
eax
ebx
*xp
*yp
0x100
=
=
=
=
=
=
yp
xp
*yp (t1)
*xp (t0)
eax
ebx
12
H2015
Assembleur
La pile – paramètres, valeurs, variables
Génie informatique et génie logiciel
13
H2015
Assembleur
La pile – paramètres, valeurs, variables
Responsabilités “caller” (main)
-
push les paramètres en ordre inverse (le dernier dans la pile le premier)
-
call
-
pop les paramètres (pop ou incrémentation %esp pour les enlever)
-
la valeur de retour en %eax
Responsabilités “callee” (procédure)
-
stocke %ebp d’appeleur dans la pile # prologue procédure push %ebp
-
sauvegarde le %esp courant dans %ebp # prologue procédure mov %esp, %ebp
-
codage, stockage variables locales dans la pile
-
sortie rapide – load %esp de %ebp (sinon pop élément par élément) #épilogue
procédure mov %ebp, %esp # retour aux valeurs initiales (clean up) pile
-
pop ancien %ebp et return – stocke valeur de retour en %eax #épilogue procédure
pop %ebp # retour aux valeurs initiales (clean up) pile
Génie informatique et génie logiciel
14
H2015
Assembleur
Génie informatique et génie logiciel
15
H2015
Assembleur
IA32/Linux Utilisation de registres
Usage special
%eax
%ebp, %esp
Caller- pour temporaires
Callee
%edx
%ebx, %esi, %edi
%ecx
Anciennes valeurs sur la pile avant
de les utiliser
Callee- pour temporaires
%ebx
%esi
Caller
%eax, %edx, %ecx
%edi
%esp
Registre %eax valeur de retour
Génie informatique et génie logiciel
Special
%ebp
16
H2015
Assembleur
int rfact(int x)
{
int rval;
if (x <= 1)
return 1;
rval = rfact(x-1);
return rval * x;
}
Génie informatique et génie logiciel
rfact:
pushl %ebp
movl %esp,%ebp
pushl %ebx
movl 8(%ebp),%ebx
cmpl $1,%ebx
jle .L78
leal -1(%ebx),%eax
pushl %eax
call rfact
imull %ebx,%eax
jmp .L79
.align 4
.L78:
movl $1,%eax
.L79:
movl -4(%ebp),%ebx
movl %ebp,%esp
popl %ebp
ret
17
H2015
Assembleur
Recursion
movl 8(%ebp),%ebx
cmpl $1,%ebx
jle .L78
leal -1(%ebx),%eax
pushl %eax
call rfact
imull %ebx,%eax
jmp .L79
.L78:
#
movl $1,%eax
.L79:
#
int rfact(int x)
{
int rval;
if (x <= 1)
return 1;
rval = rfact(x-1) ;
return rval * x;
}
Génie informatique et génie logiciel
# ebx = x
# Comp x - 1
# If <= goto Term
# eax = x-1
# Push x-1
# rfact(x-1)
# rval * x
# Goto done
Term:
# return val = 1
Done:
Registers
%ebx Valeur of x
%eax
Val temp x-1
Val retour rfact(x-1)
Valeur de retour de l’appel
18
H2015
Assembleur
eflags
CF
ZF
Carry Flag
Zero Flag
SF
OF
Sign Flag
Overflow Flag
Implicitement modifiés par des opérations arithmétiques
addl Src,Dest
C analogue: t = a + b; b = t;
CF =1 si carry out du MSB
ZF =1 si t == 0
SF = 1 si t < 0
OF = 1 si débordement complément à deux
(a>0 && b>0 && t<0) || (a<0 && b<0 && t>=0)
Non modifiés pas l’instruction leal
Génie informatique et génie logiciel
19
H2015
Assembleur
Explicitement modifiés par l’instruction de comparaison
cmpl Src2,Src1
cmpl b,a comme a-b sans destination
CF = 1 si carry out du MSB
ZF = 1 si a == b
SF =1 si (a-b) < 0
OF = 1 débordement complément à deux
(a>0 && b<0 && (a-b)<0) || (a<0 && b>0 && (a-b)>0)
Explicitement modifiés par l’instruction de test
testl Src1,Src2
testl a,b comme a&b sans destination
ZF = 1 si a&b == 0
SF = 1 si a&b < 0
Génie informatique et génie logiciel
20
H2015
4
Assembleur
Opérations arithmétiques : additions
Affectent tous eflags selon le résultat de l’opération
• add source, dest
dest ← dest + source (M, R; R, M; R,R)
• adc source, dest
dest ← dest + source + CF
• sub source, dest
dest ← dest – source
• sbb source, dest
dest ← dest – source – CF
Eflag affectés: OF, SF, ZF, PF, CF, AF
•
•
cmp source, dest
dest – source (seulement eflag est affecté)
•
neg dest
dest ← 0 – dest (M; R - SF, ZF, PF, CF, AF )
inc dest
dest ← dest + 1 (M; R)
• dec dest
dest ← dest – 1 (M; R )
Eflag affectés: OF, SF, ZF, PF, AF
•
Génie informatique et génie logiciel
21
H2015
Assembleur
Branchement Exemple
cmpl b,a comme a-b sans destination
_max:
pushl %ebp
movl %esp,%ebp
int max(int x, int y)
{
if (x > y)
return x;
else
return y;
}
movl 8(%ebp),%edx
movl 12(%ebp),%eax
cmpl %eax,%edx
jle L9
movl %edx,%eax
Ignoré si x ≤ y
L9:
movl %ebp,%esp
popl %ebp
ret
Génie informatique et génie logiciel
22
H2015
Assembleur
“Do-While” Loop
Assembleur
Goto
int fact_goto
(int x)
{
int resultat = 1;
loop:
resultat *= x;
x = x-1;
if (x > 1)
goto loop;
return resultat;
}
Registres
%edx
x
%eax
resultat
_fact_goto:
pushl %ebp
movl %esp,%ebp
movl $1,%eax
movl 8(%ebp),%edx
#
#
#
#
prologue
prologue
eax = 1
edx = x
L11:
imull %edx,%eax
decl %edx
cmpl $1,%edx
jg L11
#
#
#
#
resultat *= x
x-x - 1
if > goto loop
movl %ebp,%esp
popl %ebp
ret
Génie informatique et génie logiciel
# epilogue
#
#
23
H2015
5
Assembleur
Boucles
•Instructions
spéciale: loop, loopz, loopnz
― N’affectent
pas eflags
― loop quelquepart
ecx ← ecx – 1 ; (ecx ≠ 0) → (eip ← quelquepart)
― loopz quelquepart
ecx ← ecx – 1 ; (ecx ≠ 0 ∧ ZF = 1) → (eip ← " )
●
Pour « loop while zero »
― loopnz
●
quelquepart ecx ← ecx – 1 ; (ecx ≠ 0 ∧ ZF = 0) → (eip ← " )
Pour « loop while not zero »
•Exemple:
mov $16,%ecx
mov $chaine,%ebx
L1:
incl %ebx
cmpb $' ', (%ebx)
loopz L1
# nombre de répétitions maximal
# %ebx contient l'adresse d’une chaîne de caractères
# caractère suivant # aussi i++
# est-ce un espace ? Si oui ZF=1, sinon ZF=0
# saute si ZF=1 et décompte pas fini
Génie informatique et génie logiciel
24
H2015
Assembleur
INF1600: Architecture des
micro-ordinateurs
Assembleur
Arithmétique, logique et directives
Responsable du cours : Giovanni Beltrame
[email protected]
Local: M-4109
Chargée de cours:
Luiza Gheorghe
[email protected]
Génie informatique et génie logiciel
25
H2015
Assembleur
Programme du cours
07/01/2016
Introduction
29/01/2016
Organisation interne du
microprocesseur
Lien entre C++ et assembleur
TP2
TP0
Architecture
du microprocesseur
Hierarchie de mémoire
04/02/2016 – 18/02/2016
TP5
Programmation en assembleur
Mémoires
Introduction aux outils
14/01/2016
Micro-ordinateur
et périphériques
TP4
TP1
TP3
Périphériques et architecture
Programmation en assembleur
22/01/2016
Architecture
d'un microprocesseur
Génie informatique et génie logiciel
C++ et assembleur
Théorie
Travaux Pratiques
26
H2015
Assembleur
Objectifs de la leçon
1
Utiliser les opérations arithmétiques (multiplication et
division) de l'architecture x86
2
Utiliser les opérations logiques (xor,and,or,...) de
l'architecture x86
3
Utiliser les opérations de décalage (shr, shl,...) de
l'architecture x86
4
Utiliser les instructions sur les indicateurs de
l'architecture x86
5
Utiliser les directives de l'assembleur x86
Génie informatique et génie logiciel
27
H2015
Assembleur
Agenda
•
Instructions
•
Diréctives
4
•
Exemple
5
Génie informatique et génie logiciel
1 2 3
28
H2015
%eax
%ah
%al
%edx
%dh
%dl
%ecx
%ch
%cl
%ebx
%bh
%bl
Assembleur
Opérations arithmétiques : multiplications
●
mul source8
ax ← al * source8 (non signé)
●
mul source16
dx#ax ← ax * source16
%edi
●
mul source32
edx#eax ← eax * source32
%esp
1
%esi
%ebp
●
●
Attention – dans cette forme
●
source ne peux pas être immédiate
●
edx, dx ne peuvent pas être immédiat
CF et OF si résultat prend plus de place que la source
Génie informatique et génie logiciel
29
H2015
Assembleur
Opérations arithmétiques : multiplications
●
imul source8
…
●
imul source16
…
●
imul source32
…
●
imul source, dest
dest ← dest * source
●
imul const, source, dest
dest ← const * source
(même chose mais signé)
– const est immédiat; source est registre ou mémoire; dest est registre
Génie informatique et génie logiciel
30
H2015
%eax
%ah
%al
%edx
%dh
%dl
%ecx
%ch
%cl
%ebx
%bh
%bl
Assembleur
Opérations arithmétiques : divisions
●
div source8
al ← ax / source8 : (non signé)
●
ah ← ax mod source8
%esi
div source16
ax ← dx#ax / source16 :
%edi
dx ← dx#ax mod source16
%esp
div source32
eax ← edx#eax / source32 :
%ebp
edx ← edx#eax mod source32
Attention source – registre ou mémoire mais non immédiate
edx, ed ne peuvent pas être immédiate
idiv source8
…
(même chose mais signé)
idiv source16
…
idiv source32
…
●
N’existe pas: idiv source, dest
●
●
●
●
●
Génie informatique et génie logiciel
31
1
H2015
1
Assembleur
Exemple de multiplications
.data
unword: .word 20
.text
.global main
main:
mov $3,%ax
mov $5, %bx
mov $10, %dx
mul %bx
mulw unword
mov $255,%bl
mov $2,%al
mul %bl
mov $2,%al
imul %bl
mov $10, %bx
imul %ax, %bx
ret
# section initialisé, lisible, écrivable
# section lisible, exécutable, non écrivable
# la valeur de %dx sera écrasée
# dx ← 0 : ax ← 15 : CF ← 0 : OF ← 0
# dx ← 0 : ax ← 300 : CF ← 0 : OF ← 0
# ax ← 1FE16 (ou 51010) : CF ← 1 : OF ← 1
# (car résultat n’entre pas dans %al)
# Note: 255 sur 8-bits est -1 en signé
# ax ← FFFE16 (ou -2) : CF ← 0 : OF ← 0
# bx ← -20 : CF ← 0 : OF ← 0
Génie informatique et génie logiciel
32
H2015
1
Assembleur
Exemple de divisions
.data
unword: .word 20
.text
.global main
main:
mov $0,%dx
mov $78, %ax
mov $5, %bx
div %bx
# section initialisé, lisible, écrivable
# section lisible, exécutable, non écrivable
# ax ← 15 : dx ← 3
mov $0,%dx
mov $122,%ax
divw unword
# ax ← 6 : dx ← 2
mov $10, %bx
((dx#ax)/bx donne 15 reste 3)
((dx#ax)/M16[unword] donne 6 reste 2)
mov $0xffff,%dx
mov $0xffff,%ax
mov $3,%bx
#div %bx
#Divide Error (débordement)
ret
Génie informatique et génie logiciel
33
H2015
2
Assembleur
Instructions logiques
●
Affectent eflags selon le résultat
– OF ← 0 : CF ← 0 : SF ← résultat⟨31⟩ : ZF ← (résultat=0) :
PF ← ((nombre de bits à 1 dans résultat) +1) mod 2
●
Opérations bit par bit
– (A#B#C) ⊗ (D#E#F) = (A⊗D)#(B⊗E)#(C⊗F)
●
or source, dest
dest ← dest ∨ source
– Peut servir à forcer des bits à 1
●
and source, dest
dest ← dest ∧ source
– Peut servir à forcer des bits à 0
●
xor source, dest
dest ← dest ⊕ source
– Peut servir à inverser des bits
– Peut servir à mettre à 0 un registre: xor %eax, %eax
Génie informatique et génie logiciel
34
H2015
2
Assembleur
Exemple d’opérations logiques
.data
nombre:
.byte 6
lettre: .string “BONJOUR”
.text
.global main
main:
mov nombre,%al
or $’0’, %al
and $0xF, %al
# chaque lettre prend un octet
#6
# ‘6’, aurait pu faire add $’0’,%al aussi
# 6, prend les 4 bits de poids faible
# le code suivant suppose que c’est une lettre (‘A’-’Z’ ou ‘a’-’z’)
mov lettre+2,%al
# ‘N’ ASCII ‘N’ – 78 (4E)
xor $0x20,%al
# ‘n’, change majuscule ↔ minuscule
and $~0x20,%al
# ‘N’, force majuscule
or $0x20,%al
# ‘n’, force minuscule ASCII ‘n’ 110 (6E)
ret
Génie informatique et génie logiciel
35
H2015
3
Assembleur
Instructions de décalage
●
●
●
Affectent eflags (CF, OF, ZF)
●
CF ← dernier bit sorti
●
Si source est $1, OF ← résultat<signe> != valeur_décalée<signe>
Opérandes
●
Source: immédiat ou %cl
●
Dest: registre ou mémoire(8, 16 ou 32 bits)
Décale d’un maximum de 32 bits
●
●
Shift right
sar source, dest – dest#CF ← src5@dest<31> # dest<31..src5-1>
●
●
src5 := source<4..0>
shr source, dest – dest#CF ← src5@0 # dest<31..src5-1>
●
●
Décale de src5 bits
Shift arithmetic right
shrd source, source2, dest
dest#CF ← source2<src5-1..0> # dest<31..src5-1>
●
source2 doit être registre
Génie informatique et génie logiciel
36
H2015
3
Assembleur
Instructions de décalage
●
●
●
●
●
●
ror source, dest
– Rotate right
dest#CF ← dest⟨src5-1..0⟩ # dest⟨31..src5-1⟩
rcr source, dest
dest#CF ← (dest#CF)⟨src5-1..0⟩ # (dest#CF)⟨32..src5⟩
– Rotate (through) carry right
shl source, dest
CF#dest ← dest⟨32-src5..0⟩ # src5@0
– Shift (arithmetic) left (sal := shl)
shld source, source2, dest
CF#dest ← dest⟨32-src5..0⟩ # source2⟨31..32-src5⟩
rol source, dest
– Rotate left
CF#dest ← dest⟨32-src5..0⟩ # dest⟨31..32-src5⟩
rcl source, dest
CF#dest ← (CF#dest)⟨32-src5..0⟩ # (CF#dest)⟨32..33-src5⟩
– Rotate (through) carry left
Génie informatique et génie logiciel
37
H2015
3
Assembleur
Exemple de décalage
.text
.global main
main:
mov $0b11110111,%al
sar $1, %al
shl $1, %al
shl $5, %al
rol $1, %al
mov $4, %cl
rcl %cl, %al
mov $0x12345678, %eax
ror $8, %eax
mov $0xABCDEF00, %edx
shld $12, %edx, %eax
ret
Génie informatique et génie logiciel
# al ← 111110112 : CF ← 1 : OF ← 0
# al ← 111101102 : CF ← 1 : OF ← 0
# al ← 110000002 : CF ← 0
# al ← 100000012 : CF ← 1 : OF ← 0
# al ← 000111002 : CF ← 0
# eax ← 7812345616 : CF ← 0
# eax ← 23456ABC16 : CF ← 1
38
H2015
4
Assembleur
Instructions sur les indicateurs
●
●
●
●
●
●
●
●
●
stc
clc
cmc
cld
std
pushf
popf
lahf
sahf
CF ← 1
(set carry)
CF ← 0
(clear carry)
CF ←!CF
(complement carry)
DF ← 0
(clear direction, direction positive)
DF ← 1
(set direction, direction négative)
push(eflags) (push flags)
eflags ← pop (pop flags)
AH ← eflags<7..0> (load ah flags)
eflags<7..0> ← AH (store ah flags)
Génie informatique et génie logiciel
39
H2015
Assembleur
Agenda
•
Instructions
•
Diréctives
4
•
Exemples
5
Génie informatique et génie logiciel
1 2 3
40
H2015
4
Assembleur
Directives
●
Remplissage de mémoire
– .fill répétitions, NBoctets, valeur(=0)
– .skip répétitions, valeur
Équivalent à .fill répétitions, 1, valeur
.space synonyme de .skip
●
Alignement
– .balign val1, val2(=0 ou nop), val3(=infini)
Aligne sur un multiple de val1 en utilisant val2 pour remplir
Si le nombre d’octet à placer n’est pas > val3
– .p2align val1, val2, val3
Fait un .balign 2val1, val2, val3
●
Alignement selon Intel (recommandations)
– Aligner les données sur des multiples de leur taille
– Aligner les étiquettes du code, sur 16 octets, si c’est a moins de 8 octets
Étiquette de boucle
Étiquette suit un saut inconditionnel
Génie informatique et génie logiciel
41
H2015
Assembleur
Agenda
•
Instructions
•
Diréctives
5
•
Exemples
3 4 5
Génie informatique et génie logiciel
1 2 3 4
42
H2015
3
Assembleur
4
Exemple : renverse
.text
.global renverse
.p2align 4
renverse:
mov 4(%esp), %al
mov $8,%ecx
xor %bl, %bl
.p2align 4, , 7
boucle:
shl $1,%al
rcr $1,%bl
loop boucle
mov %bl, %al
ret
Génie informatique et génie logiciel
# l’argument (ex.: 110111002)
# valeur de retour (ex.: 001110112)
43
H2015
Assembleur
3
5
4
Exemple : lecture d’un nombre binaire
.text
.global inbin
# lire un nombre binaire sur 32 bits et validation
# entrée:
EBX = l'adresse de la chaîne de caractères contenant des '0' et '1'
# sortie:
EAX = le nombre
# CF = 1 si on a des lettres différentes de '0' ou '1'
# ou si le nombre de bits dépasse 32
# ne modifie aucun registre
inbin:
push
%ebx
push
%ecx
push
%edx
xorl
%edx,%edx
xorl
%eax,%eax
xorl
%ecx,%ecx # nombre de chiffres
Génie informatique et génie logiciel
44
H2015
3
Assembleur
4
5
Exemple : lecture d’un nombre binaire (suite)
trouve:
mov
(%ebx),%al
cmp
$'\n', %al
je termine
cmp
$'1', %al
je suite
cmp
$'0',%al
je suite
jmp nonbin
suite:
cmp
$32,%ecx
ja nonbin
and $0xF,%eax
shl $1,%edx
or %al,%dl
inc %ecx
inc %ebx
jmp trouve
Génie informatique et génie logiciel
# prendre un caractère
# fin de la ligne?
# chiffre 0 ou 1
#jump if above
45
H2015
Assembleur
3
4
5
Exemple : lecture d’un nombre binaire (suite)
termine:
mov
pop
pop
pop
ret
%edx, %eax
%edx
%ecx
%ebx
nonbin:
# il y a une erreur dans le code…
xor %eax, %eax
stc
# set carry, CF ← 1
jmp termine
Génie informatique et génie logiciel
46
H2015
Assembleur
Agenda
•
Instructions
•
Diréctives
5
•
Exemples
3 4 5
Génie informatique et génie logiciel
1 2 3 4
47
H2015
Assembleur
Synthèse
1
Utiliser les opérations arithmétiques (multiplication et
division) de l'architecture x86
2
Utiliser les opérations logiques (xor,and,or,...) de
l'architecture x86
3
Utiliser les opérations de décalage (shr, shl,...) de
l'architecture x86
4
Utiliser les instructions sur les indicateurs de
l'architecture x86
5
Utiliser les directives de l'assembleur x86
Génie informatique et génie logiciel
48
H2015
Téléchargement