Syst`eme 1 TD10 : Initiation `a la programmation en assembleur

IUT de Montreuil - D´epartement Informatique 2016-2017
Syst`eme 1
TD10 : Initiation `a la programmation en assembleur
1 G´en´eralit´es
1.1 Structure d’un programme en assembleur (vu en cours)
.data # zone de donn´ees
var:
#on met les d´elarations de variables ici
.text # zone d’instructions
.globl main # ´etiquette
main:
#on met les instructions ici
ret # retour
Exemple :
.data # zone de donn´ees
var1:
.byte 65 # un octet initialis´e `a 65 en decimal
var2:
.byte 1 # un octet `a 1
.text # zone d’instructions
.globl main
main: #´etiquette
movb var1, %al #copie dans le registre al le contenu
#d’un octet `a l’adresse associ´ee
#`a l’´etiquette var1
movb %al, var2
ret #retour
1 / 5
IUT de Montreuil - D´epartement Informatique 2016-2017
1.2 Instructions de copie (vu en cours)
movb src, des : copier la valeur d’un octet de “src” dans “des”
movw src, des : copier la valeur de deux octets de “src” dans “des”
movl src, des : copier la valeur de quatre octets de “src” dans “des”
movq src, des : copier la valeur de huit octets de “src” dans “des”
1.3 Instructions de branchement (vu en cours)
Les instructions de branchement permettent de modifier directement le contenu du registre IP (comp-
teur de programme) et de changer en cons´equence le flux d’ex´ecution de programme.
L’instruction de branchement inconditionnel jmp <adresse>permet de sauter `a l’instruction se trou-
vant `a une adresse symbolique (´etiquette) ou constante.
Exemple :
.text # zone d’instructions
.globl main
main:
movl $2, %eax
jmp suite
movl $4, %ebx
suite:
movl %ebx, %eax
ret
Les instructions de branchement conditionnel les plus courants :
jz <adresse>: sauter `a <adresse>si ZF=1
jnz <adresse>: sauter `a <adresse>si ZF=0
jc <adresse>: sauter `a <adresse>si CF=1
jnc <adresse>: sauter `a <adresse>si CF=0
jo <adresse>: sauter si `a <adresse>OF=1
jno <adresse>: sauter si `a <adresse>OF=0
1.4 Les registres Intel x86
Un processeur de la famille Intel x86 poss`ede un ensemble de registres pour stocker temporairement
des donn´ees lors d’un calcul. Les registres les plus courants sont :
rax, rbx, rcx, rdx, rsi, rdi, rsp (64 bits)
2 / 5
IUT de Montreuil - D´epartement Informatique 2016-2017
eax, ebx, ecx, edx (32 bits)
ax, bx, cx, dx (16 bits)
dh, dl, ch, cl, bh, bl, ah, al (8 bits)
Un programme en assembleur peut acc´eder directement `a ces registres. Pour distinguer d’un registre
d’une ´etiquette on le fait pr´ec´eder par un %.
1.5 Modes d’adressage
L’adressage imm´ediat (constante) : pour introduire une valeur en une base num´erique
Exemple : movb $10, %al : copie la valeur 10 dans le registre “al”
L’adressage direct : pour acc´eder au contenu d’une variable.
Exemple : movb var1, %al : copie dans “al” le contenu d’un octet de la variable “var1”
L’adressage registre : pour acc´eder au contenu d’un registre.
Exemple : movb $10, %al
– L’adressage indirect : pour r´ecup´erer l’adresse d’une case m´emoire ou le contenu d’une zone de
m´emoire point´ee par un registre
Exemple :
movq $var1, %rsi : copie dans “rsi” l’adresse de la case m´emoire associ´ee `a la variable “var1”
movw (%rsi), %ax : copie dans “ax” le contenu de deux octets de la zone de m´emoire dont l’adresse
est indiqu´ee par “rsi”
1.6 Affichage
Pour afficher un caract`ere ou une chaˆıne de caract`eres en assembleur, on peut faire appel `a l’interruption
int 0x80 de Linux.
.data # zone de donn´ees
var:
.byte 65 # le code d’ascii de A
.string "Bonjour!" # chaine de caract`eres
.text # zone de code
.globl main
main:
movq $4, %rax # pour ´ecrire
movq $1, %rbx # stdout
movq $var, %rcx # l’adresse de la chaine
movq $8, %rdx # le nb de carac. `a afficher
int $0x80 # interruption de Linux pour l’affichage
ret
Exercice 1
Parmi les propositions suivantes, lesquelles sont correctes et pourquoi ?
1. %bh, %bl sont des registres d’une capacit´e de 8 bits
3 / 5
IUT de Montreuil - D´epartement Informatique 2016-2017
2. Toute modification du contenu de %cl entraine une modification du contenu de %ch
3. Toute modification du contenu de %bl entraine une modification du contenu de %bx, %ebx et %rbx
4. Toute modification du contenu de %rdx entraine une modification du contenu de %edx, %dx, %dh
et %dl
5. Une modification du contenu de %rax peut entrainer une modification du contenu de %eax, %ax,
%ah, %al
Exercice 2
1. Ecrire un programme qui copie respectivement dans %al et %ax le contenu de l’octet de poids fort et
des deux octets de poids fort d’une zone de m´emoire d´efinie et initialis´ee par les directives suivantes :
.data
var4:
.byte 1
.byte 2
.byte 3
.byte 4
Donner la valeur de %al et %ax apr`es que les copies sont r´ealis´ees.
2. Ecrire un programme qui copie respectivement dans %rax et %rbx le contenu des 8 octets de poids
faible et 8 octets de poids fort d’une zone de m´emoire de 16 octets associ´ee `a une variable d´efinie et
initialis´ee par les directives suivantes :
.data
var16:
.long 1
.long 2
.long 3
.long 4
Donner la valeur de %rax et %rbx apr`es que les copies sont r´ealis´ees.
3. Ecrire un programme qui copie respectivement dans %al, %ax, %eax et %rax le contenu d’un octet,
de 2 octets, de 4 octets et de 8 octets d’une zone de m´emoire d´efinie et initialis´ee par les directives
suivantes :
.data
var8:
.word 1
.word 2
.word 3
.word 4
Donner la valeur de %al, %ax, %eax et %rax apr`es que les copies sont r´ealis´ees.
4 / 5
IUT de Montreuil - D´epartement Informatique 2016-2017
Exercice 3
1. Ecrire un programme qui r´ealise une addition et affiche un message s’il y a un d´ebordement. Tester
votre programme avec des nombres non sign´es et sign´es.
2. Ecrire un programme qui copie 100 octets d’une zone de m´emoire dans une autre.
5 / 5
1 / 5 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !