Académique Documents
Professionnel Documents
Culture Documents
Entr
ees/Sorties
Sous-programmes
Exemple
3 decembre 2012
Archi
1/30
Entr
ees/Sorties
Sous-programmes
Exemple
Archi
2/30
Entr
ees/Sorties
Sous-programmes
Exemple
Programme en Assembleur
instruction op
erandes
Archi
; commentaire
3/30
Entr
ees/Sorties
Sous-programmes
Exemple
Sections de donn
ees
B Donnees initialisees : SECTION .data
declarer des donnees initialisees avec la directive : dX
X = b (1 octet), w (2 octets) ou d (4 octets = 1 mot).
exemples :
l1: db
db
dw
dw
l2: dw
l3: dw
0x55
0x55,0x66,0x77
0x1234
a
ab
abc
;
;
;
;
;
;
loctet 0x55
3 octets successifs
0x34 0x12 (little endian)
0x61 0x00
0x61 0x62 (caract`
eres)
0x61 0x62 0x63 0x00 (string)
nb lettres:
Archi
equ 26
4/30
Entr
ees/Sorties
Sous-programmes
Exemple
Sections de donn
ees - suite
repeter une declaration avec la directive : times
exemples :
p0: times 100
p1: times 28
db 0
; 100 fois loctet 0x00
dd 0xffffffff ; 28 fois le m^
eme mot
resb
resw
resd
100
1
1
; r
eserve 100 octets
; r
eserve 2 octets
; r
eserve 1 mot (4 octets)
! ! ! Etiquette
= adresse de la donnee.
Archi
5/30
Entr
ees/Sorties
Sous-programmes
Exemple
Section de code
B Corps du programme : SECTION .text
commencer par declarer global letiquette de debut de
programme (main) pour quelle soit visible :
SECTION .text
global main
main:
...
fin de fichier :
mov
mov
int
ebx, 0
eax, 1
0x80
Archi
6/30
Entr
ees/Sorties
Sous-programmes
Exemple
Fichier squelette
%include "asm_io.inc"
SECTION .data
; donn
ees initialis
ees
;
SECTION .bss
; donn
ees non initialis
ees
;
SECTION .text
global main
; rend l
etiquette visible de lext
erieur
main:
; programmme
;
mov ebx,0
mov eax,1
int 0x80
7/30
Entr
ees/Sorties
Sous-programmes
Exemple
Assembler un programme
Assemblage : creer un fichier objet (transformer le programme
ecrit en langage dassemblage en instructions machine)
nasm -g -f <format> <fichier> [-o <sortie>]
Exemples :
nasm -g -f coff toto.asm
nasm -g -f elf toto.asm -o toto.o
Produire un listing des instructions machine :
nasm -g -f elf toto.asm -l toto.lst
Edition
de lien :
ld -e main toto.o -o toto
En utilisant des biblioth`eques C ou ecrites en C (par exemple,
asm io de P. Carter, pour les E/S) :
nasm -g -f elf toto.asm
gcc toto.o asm_io.o -o toto
Archi
8/30
Entr
ees/Sorties
Sous-programmes
Exemple
Entr
ees/Sorties
Archi
9/30
Entr
ees/Sorties
Sous-programmes
Exemple
Interruptions
Le flot ordinaire dun programme doit pouvoir etre interrompu
pour traiter des ev`enements necessitant une reponse rapide.
Mecanisme dinterruptions (ex : lorsque la souris est deplacee, le
programme en cours est interrompu pour gerer ce deplacement).
Passage du controle `
a un gestionnaire dinterruptions.
Certaine interruptions sont externes (ex : la souris).
Dautres sont soulevees par le processeur, `
a cause dune erreur
(traps) ou dune instruction specifique (interruption logicielle).
En general, le gestionnaire dinterruptions redonne le controle au
programme interrompu, une fois linterrupion traitee.
Il restaure tous les registres (sauf eax).
Le programme interrompu sexecute comme si rien netait arrive.
Les traps arretent generalement le programme.
Archi
10/30
Entr
ees/Sorties
Sous-programmes
Exemple
Entr
ees/sorties
Entr
ees-sorties (I/O) : echanges dinformations entre le
processeur et les peripheriques.
Entrees : donnees envoyees par un peripherique (disque, reseau,
clavier...) `a destination de lunite centrale.
Sorties : donnees emises par lunite centrale `
a destination dun
peripherique (disque, reseau, ecran...).
Gestion par interruptions :
permet de reagir rapidement `
a un changement en entree.
le peripherique previent le processeur par une interruption,
le processeur interrompt la t
ache en cours, effectue laction
prevue pour cette interruption et reprend lexecution du
programme principal l`
a o`
u il lavait laissee.
Gestion haut-niveau :
Biblioth`eques standards en C pour les E/S (pas en assembleur).
MAIS, les conventions dappels utilisees par C sont complexes...
Archi
11/30
Entr
ees/Sorties
Sous-programmes
Exemple
edx,
ecx,
ebx,
eax,
0x80
lg1
msg1
1
; stdout
4
; write
Archi
12/30
Entr
ees/Sorties
Sous-programmes
Exemple
extern printf
SECTION .data
msg2: db "msg 2", 10, 0
SECTION .text
global main
main:
...
push
call
...
msg2
printf
Archi
13/30
Entr
ees/Sorties
Sous-programmes
Exemple
%include "asm_io.inc"
SECTION .data
msg3: db "msg 3", 10, 0
SECTION .text
global main
main:
...
mov eax, msg3
call print_string
...
Archi
14/30
Entr
ees/Sorties
Sous-programmes
Exemple
print nl
read int
read char
affiche `
a lecran la valeur de lentier stocke dans eax
affiche `
a lecran le caract`ere dont le code ASCII est
stocke dans al
affiche `
a lecran le contenu de la chane de caract`eres
a ladresse stockee dans eax. La chane doit etre une
`
chane de type C (terminee par 0)
affiche `
a lecran un caract`ere de nouvelle ligne
lit un entier au clavier et le stocke dans le registre eax
lit un caract`ere au clavier et stocke son code ASCII
dans le registre eax
15/30
Entr
ees/Sorties
Sous-programmes
Exemple
Sous-programmes
Archi
16/30
Entr
ees/Sorties
Sous-programmes
Exemple
Sous-programmes
Les sous-programmes servent `
a mutualiser du code (eviter les
copier-coller)
Exemple : les fonctions des langages haut niveau.
Le code appelant le sous-programme et le sous-programme
lui-meme doivent se mettre daccord sur la facon de se passer
les donnees (conventions dappel).
Un saut peut etre utilise pour appeler le sous-programme, mais
le retour pose probl`eme.
Le sous-programme peut etre utilise par differentes parties du
programme B il doit revenir au point o`
u il a ete appele !
Donc, le retour du sous-programme ne peut pas etre code en
dur par un saut vers une etiquette.
Letiquette de retour doit etre un param`etre du sous-programme.
Archi
17/30
Entr
ees/Sorties
Sous-programmes
Exemple
cmp
jl
SECTION .data
msg1: db "entier <10 ?",10,0
msg2: db "bravo",10,0
msg3: db "perdu",10,0
eax, 10
ok
rate: mov
call
jmp
eax, msg3
print_string
fin
SECTION .text
global main
ok:
mov
call
eax, msg2
print_string
main: mov
call
fin:
mov
mov
int
ebx, 0
eax, 1
0x80
call
eax, msg1
print_string
read_int
Archi
18/30
Entr
ees/Sorties
Sous-programmes
Exemple
Sous-programme `
a la main
%include "asm_io.inc"
SECTION .data
msg1: db "entier <10 ?",10,0
msg2: db "bravo",10,0
msg3: db "perdu",10,0
SECTION .text
global main
main: mov
call
eax, msg1
print_string
mov
jmp
ret_sb: call
ecx, ret_sb
sb
print_string
fin:
mov
mov
int
ebx, 0
eax, 1
0x80
sb:
cmp
jl
mov
jmp
mov
jmp
eax, 10
ok
eax, msg3
ecx
eax, msg2
ecx
rate:
ok:
call
read_int
Archi
19/30
Entr
ees/Sorties
Sous-programmes
Exemple
20/30
Entr
ees/Sorties
Sous-programmes
Exemple
call
call
sb
print_string
fin:
mov
mov
int
ebx, 0
eax, 1
0x80
sb:
cmp
jl
mov
ret
mov
ret
eax, 10
ok
eax, msg3
rate:
main: mov
call
call
eax, msg1
print_string
ok:
eax, msg2
read_int
Archi
21/30
Entr
ees/Sorties
Sous-programmes
Exemple
add
push
ret
eax, 2
eax
; d
epile la valeur de eax !!
22/30
Entr
ees/Sorties
Sous-programmes
Exemple
23/30
Entr
ees/Sorties
Sous-programmes
Exemple
24/30
Entr
ees/Sorties
Sous-programmes
Exemple
25/30
Entr
ees/Sorties
Sous-programmes
Exemple
param
fnc
esp, 4
; passe un param`
etre
; retire le param`
etre de la pile
26/30
Entr
ees/Sorties
Sous-programmes
Exemple
fin:
sb:
print_string
mov
mov
int
ebx,0
eax,1
0x80
push
mov
cmp
jl
rate: mov
pop
ret
ok:
mov
pop
ret
SECTION .text
global main
main: mov
eax,msg1
call print_string
call read_int
push
call
add
call
eax
sb
esp, 4
Archi
ebp
ebp, esp
dword [ebp+8], 10
ok
eax, msg3
ebp
eax, msg2
ebp
27/30
Entr
ees/Sorties
Sous-programmes
Exemple
Exemple complet
Archi
28/30
Entr
ees/Sorties
Sous-programmes
Exemple
Archi
29/30
Entr
ees/Sorties
Sous-programmes
Exemple
Programme
%include "asm_io.inc"
SECTION .data
msg1:db
msg2:db
msg3:db
blanc:
"nb bandes?",10,0
"nb lignes?",10,0
"caractere?",10,0
db "
",0
SECTION .bss
nbb: resd 1
nbl: resd 1
SECTION .text
global main
mov
call
call
mov
eax, msg2
print_string
read_int
[nbl], eax
mov
call
call
call
mov
eax,msg3
print_string
read_char
read_char
ecx, [nbl]
ligne:
push ebp
mov ebp, esp
push ecx
nxt:push
push
call
add
pop
eax
dword [nbb]
ligne
esp, 4
eax
mov
sv: mov
call
mov
call
loop
ecx, [ebp+8]
eax, [ebp+12]
print_char
eax, blanc
print_string
sv
call print_nl
pop ecx
main:
mov
call
call
mov
loop nxt
eax, msg1
print_string
read_int
[nbb], eax
fin:mov ebx, 0
mov eax, 1
int 0x80
Archi
pop
ret
ebp
30/30