Beruflich Dokumente
Kultur Dokumente
Programme en Assembleur
Sections de données
Section de code
main:
...
fin de fichier :
mov ebx, 0 ; code de sortie, 0 = normal
mov eax, 1 ; numéro de la commande exit
int 0x80 ; interruption 80 hex, appel au noyau
Structure d’un programme Entrées/Sorties Sous-programmes
Fichier squelette
%include "asm_io.inc"
SECTION .data
; données initialisées
;
SECTION .bss
; données non initialisées
;
SECTION .text
global main ; rend l’étiquette visible de l’extérieur
main:
; programmme
;
mov ebx,0 ; code de sortie, 0 = normal
mov eax,1 ; numéro de la commande exit
int 0x80 ; interruption 80 hex, appel au noyau
Structure d’un programme Entrées/Sorties Sous-programmes
Assembler un programme
Assemblage : créer un fichier objet (transformer le programme
écrit en langage d’assemblage 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
Édition de lien :
ld -e main toto.o -o toto
En utilisant des bibliothèques C ou écrites 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
Structure d’un programme Entrées/Sorties Sous-programmes
Entrées/Sorties
Structure d’un programme Entrées/Sorties Sous-programmes
Interruptions
Entrées/sorties
Entrées-sorties (I/O) : échanges d’informations entre le
processeur et les périphériques.
Entrées : données envoyées par un périphérique (disque, réseau,
clavier...) à destination de l’unité centrale.
Sorties : données émises par l’unité centrale à destination d’un
périphérique (disque, réseau, écran...).
Gestion “haut-niveau” :
Bibliothèques standards en C pour les E/S (pas en assembleur).
MAIS, les conventions d’appels utilisées par C sont complexes...
Structure d’un programme Entrées/Sorties Sous-programmes
SECTION .data
msg1:db "message 1",10
lg1: equ $-msg1
SECTION .text
global main
main:
...
mov edx, lg1
mov ecx, msg1
mov ebx, 1 ; stdout
mov eax, 4 ; write
int 0x80
...
Structure d’un programme Entrées/Sorties Sous-programmes
Sous-programmes
Structure d’un programme Entrées/Sorties Sous-programmes
Sous-programmes
Sans sous-programme
Rappel
rayures.asm
%include "asm_io.inc" mov eax, msg2 ligne:
call print_string push ebp
SECTION .data call read_int mov ebp, esp
mov [nbl], eax
msg1:db "nb bandes?",10,0 push ecx
msg2:db "nb lignes?",10,0 mov eax,msg3
msg3:db "caractere?",10,0 call print_string mov ecx, [ebp+8]
blanc: db " ",0 call read_char
call read_char ; !! sv: mov eax, [ebp+12]
SECTION .bss mov ecx, [nbl] call print_char
mov eax, blanc
nbb: resd 1 push eax call print_string
nbl: resd 1 push dword [nbb] loop sv
nxt:call ligne
SECTION .text loop nxt call print_nl
global main add esp, 4
pop eax pop ecx
main:
mov eax, msg1 pop ebp
call print_string fin:mov ebx, 0 ret
call read_int mov eax, 1
mov [nbb], eax int 0x80
Structure d’un programme Entrées/Sorties Sous-programmes
somme rec.asm
Évolution de la pile
s
b
retour
s 1 1
b s
b
retour retour retour
s 2 2 2 2
s b s
b b
s retour retour retour retour retour retour retour
s 3 3 3 3 3 3 3 3
b b s
### ### ### ### ### ### ### ### b ###
avant le 1er call push ebp avant le 2e avant le 3e fin de la
appel à somme_rec mov ebp, esp appel à appel à récursion
somme_rec somme_rec somme_rec 1 1+2=3 3+3=6
eax eax eax