Académique Documents
Professionnel Documents
Culture Documents
o AL<7..0> := EAX<7..0> ah al
Dans ce cours, nous utiliserons la syntaxe AT&T pour les compilateur GNU
Étiquettes
# directive on est dans le segment données
.data
val:
.word 10, -14, 30 # trois mots
Valeurs
# on est dans le segment texte (instructions)
Type .text
.global main # main est publique
main:
add %ebx %eax # addition
.data # 0x1000
poly:
.qword 10, 041
mtl:
.short 1, 0xAA
.data # 0x1000
3 2 1 0
poly:
.qword 10, 041 0x1000 0x00 0x00 0x00 0x0A
mtl: 0x1004 0x00 0x00 0x00 0x00
.short 1, 0xAA
0x1008 0x00 0x00 0x00 0x21
0x100C 0x00 0x00 0x00 0x00
0x1010 0x00 0xAA 0x00 0x01
.data # 0x1000
poly:
.qword 10, 041
mtl:
.short 1, 0xAA
.data # 0x1000
poly: # 0x1000
.qword 10, 041 3 2 1 0
mtl: # 0x1010 0x1000 0x00 0x00 0x00 0x0A
.short 1, 0xAA 0x1004 0x00 0x00 0x00 0x00
0x1008 0x00 0x00 0x00 0x21
0x100C 0x00 0x00 0x00 0x00
0x1010 0x00 0xAA 0x00 0x01
0x6E5C
.data
debut_data:
var1:
.byte 8, 9, 10, 11
var2:
.int 0x234
.word 0x5678, 256
.equ taille, fin_data – var2
fin_data:
.data # 0x1000
.float 1.5
.double 1.5
.data # 0x1000 3 2 1 0
.float 1.5 0x3FC00000
0x1000 0x3F 0xC0 0x00 0x00
.double 1.5 0x3FF8000000000000
0x1004 0x00 0x00 0x00 0x00
0x1008 0x3F 0xF8 0x00 0x00
.data # 0x1000
valeurs:
.int 0, 0, 0, 0, 0, 0, 0, 0
.text
movl $3, %eax
xorl %ebx, %ebx
movl $0x12345678, valeurs(%ebx, %eax, 2)
.data # 0x1000 3 2 1 0
valeurs:
0x1000 0x00 0x00 0x00 0x00
.int 0, 0, 0, 0, 0, 0, 0, 0
.text 0x1004 0x56 0x78 0x00 0x00
movl $3, %eax 0x1008 0x00 0x00 0x12 0x34
xorl %ebx, %ebx
movl $0x12345678, valeurs(%ebx, %eax, 2)
if( a ) if:
b;
# code pour a
else
j? partie_else
c;
# code pour b
jmp fin_du_if
partie_else:
# code pour c
fin_du_if:
do{ boucle:
b;
# code de b
} while(a);
# code de a
j? boucle
for(a; b; c) # code de a
d;
jmp test_au_debut
boucle:
Équivaut à
# code de d
a;
# code de c
while(b) {
d; test_au_debut:
c; # code de b
} j? boucle
.text
.globl main
main:
pushl $txt
call printf
addl $4, %esp
ret
Mise à jour: 2023/02/02 INF1600: Architecture des micro-ordinateurs 49
Exemples et exercices
Exemple
Programme
.data
txt: .ascii "Hello World!\n\0"
Définit une chaine de caractère
.text
.globl main
main:
pushl $txt
call printf
addl $4, %esp
ret
Mise à jour: 2023/02/02 INF1600: Architecture des micro-ordinateurs 50
Exemples et exercices
Exemple
Programme
.data
txt: .ascii "Hello World!\n\0"
.text
.globl main
Exemple
Programme
.data
txt: .ascii "Hello World!\n\0"
.text
.globl main
Exemple
Programme
.data
txt: .ascii "Hello World!\n\0"
.text
.globl main
Paramètre de la fonction:
main: Adresse de la chaine de caractères à afficher
pushl $txt
call printf
addl $4, %esp
ret
Mise à jour: 2023/02/02 INF1600: Architecture des micro-ordinateurs 53
Exemples et exercices
Exemple
Programme
.data
txt: .ascii "Hello World!\n\0"
.text
.globl main
main:
pushl $txt Sert à dépiler 4 octets (voir Concept de pile)
Pour retirer le paramètre de la fonction de la pile
call printf
addl $4, %esp
ret
Mise à jour: 2023/02/02 INF1600: Architecture des micro-ordinateurs 54
Transfert des données (petit ajout)
Instructions usuelles
mov source, destination # destination source
xchg a, b # a b : b a
lea source, destination # destination adresse de source
― « lea » pour « load effective address »
― Source doit être de type mémoire, destination de type registre 32-bits
― Donc:
main:
movl $3, %ebx
L1:
pushl $txt
call printf
addl $4, %esp
subl $1, %ebx
jnz L1
ret
Mise à jour: 2023/02/02 INF1600: Architecture des micro-ordinateurs 57
Exemples et exercices
Exercice 8
Que fait ce programme? Exécution
.data
txt: .ascii "Hello World!\n\0" $> ./a.out
.text Hello World!
.globl main Hello World!
Hello World!
main:
movl $3, %ebx
L1:
pushl $txt
call printf
addl $4, %esp
subl $1, %ebx
jnz L1
ret