Gestion du flux d’exécution
description
Transcript of Gestion du flux d’exécution
Département Informatique
Gestion du flux d’exécution
Laurent JEANPIERRE <[email protected]>
D’après le cours de Pascal FOUGERAY
IUT de CAEN – Campus 3
Département Informatique 2
Contenu du cours
Introduction
Sauts inconditionnels
Sauts conditionnels
Les boucles
Opérations sur les chaînes
Automatisation des chaînes
Département Informatique 3
Introduction
L’exécution d’un programme est rarement linéaire
Certaines instructions sont exécutées Plusieurs fois (boucles) Jamais (sauts)
Le programme ne se lit pas de haut en bas
Il existe des instructions de branchement : Sauts conditionnels Sauts inconditionnels
Département Informatique 4
Saut absolu / saut relatif
Il existe 2 types de sauts :Relatif (déplacement par rapport à EIP)Absolu (saut à une adresse précise)
L’assembleur choisit la meilleure solutionEn général, relatifAvec l’op-code le plus petit
Département Informatique 5
Contenu du cours
Introduction
Sauts inconditionnels
Sauts conditionnels
Les boucles
Opérations sur les chaînes
Automatisation des chaînes
Département Informatique 6
Définition
Un saut inconditionnelNe fait aucun testToujours réalisé :
EIP Nouvelle adressePas de modification de la pile
Pas de retour prévu
Instruction JMP
Département Informatique 7
Exemple : l’instruction JMP
Code Mnemonic Description
EB cb JMP r8 Déplacement ± 27
E9 cw JMP r16 Déplacement ± 215
E9 cd JMP r32 Déplacement ± 231
FF /4 JMP r/m16 Saut absolu vers contenu de registre/mémoire 16 bits
FF /4 JMP r/m32 Saut absolu vers contenu de registre/mémoire 32 bits
EA cd JMP 16:16 Saut hors segment absolu vers segment:offset 16 bits
EA cp JMP 16:32 Saut hors segment absolu vers segment:offset 32 bits
FF /5 JMP m16:16 Saut hors segment absolu vers segment:offset 16 bitssegment lu en mémoire
FF /5 JMP m16:32 Saut hors segment absolu vers segment:offset 32 bitssegment lu en mémoire
Département Informatique 8
Contenu du cours
Introduction
Sauts inconditionnels
Sauts conditionnels
Les boucles
Opérations sur les chaînes
Automatisation des chaînes
Département Informatique 9
Définition
Un saut conditionnel Obéit à un test Deux possibilités :
Test, puis saut si réussi Test inclus dans le saut
Si test échoue Pas de branchement Continue à l’instruction suivante
Instructions Jxxx avec xxx la condition Uniquement des sauts relatifs (même segment)
Département Informatique 10
L’instruction CMP
Compare deux opérandesCalcule en fait Destination – SourceOublie le résultat
Règle les drapeaux (Flags)C : Retenue (Carry)O : Débordement (Overflow)Z : ZéroS : SigneP : PaireA : Retenue auxiliaire (sur 4 bits, cf. BCD)
Département Informatique 11
Sauts basiques
Mnémonique Condition (Flags) Résultat
JC / JNC C = 1/0 Retenue ?
JO / JNO O = 1/0 Débordement ?
JP ou JPE / JNP ou JPO
P = 1/0Parité ?
Paire/Impaire
JS / JNS S = 1/0 Signé ?
JZ / JNZ Z = 1/0 Zéro ?
Département Informatique 12
Tests signés
Mnémonique Condition (Flags) Résultat
JG,JNLE Z=0, S=O >
JGE,JNL S=O ≥
JL,JNGE S≠O <
JLE,JNG Z=1 ou S≠O ≤
JE,JZ Z=1 =
JNE,JNZ Z=0 ≠
Département Informatique 13
Tests non signés
Mnémonique Condition (Flags) Résultat
JA,JNBE C=0, Z=0 >
JAE,JNB,JNC C=0 ≥
JB,JC,JNAE C=1 <
JBE,JNA C=1 ou Z=1 ≤
JE,JZ Z=1 =
JNE,JNZ Z=0 ≠
Département Informatique 14
Sauts : résumé
Test Signé Non Signé
= JE,JZ JE,JZ
≠ JNE,JNZ JNE,JNZ
< JL,JNGE JB,JNAE,JC
≤ JLE,JNG JBE,JNA
> JG,JNLE JA,JNBE
≥ JGE,JNL JAE,JNB,JNC
Département Informatique 15
Contenu du cours
Introduction
Sauts inconditionnels
Sauts conditionnels
Les boucles
Opérations sur les chaînes
Automatisation des chaînes
Département Informatique 16
Les boucles
Permettent de répéter des instructionsPlusieurs fois (for…)Tant que… (while…)Jusqu’à ce que… (until…)
Peuvent être réalisées Avec des sauts conditionnelsAvec des instructions spécialiséesloop, loope, loopz, jcxz loopne, loopnz, jecxz
Département Informatique 17
L’instruction LOOPcc
Décrémente ECXSaute si ≠ 0
Si cc non vide (e,z,ne,nz)Possibilité de sortir avant que ECX = 0 loope, loopz : Sort si Z=1 loopne, loopnz : Sort si Z=0
Département Informatique 18
L’instruction JeCXZ
Saute si eCX = 0Permet de quitter une boucle loop dès
le début (par exemple)Exemple :
movl $0,%ecx
Boucle:
…
loop Boucle
232=4294967296 itérations !
Département Informatique 19
L’instruction JeCXZ (2)
Exemple2 :movl $0,%ecx
Boucle:
jecxz Fin
…
loop Boucle
Fin:
aucune itération !
Département Informatique 20
Contenu du cours
Introduction
Sauts inconditionnels
Sauts conditionnels
Les boucles
Opérations sur les chaînes
Automatisation des chaînes
Département Informatique 21
Introduction
On a souvent des opérations à faire sur une suite de données simples…
Les plus courantes étant des manipulations de chaînes de caractères
Une chaîne sera donc : Une suite de données (8b, 16b, ou 32b) Placées à la suite les unes des autres Ex : .string "abcdefg" : 8 caractères Ex2: .short 1,2,3,4,5 : 5 mots de 16 bits
Département Informatique 22
Introduction (2)
Plusieurs opérations possiblesModification de chaîne
lods, stosCopie de chaîne
movsComparaison de chaînes
cmpsAnalyse de chaîne
scas
Département Informatique 23
Introduction (3)
Principe de base : On travaille dans le segment ES À partir de l’offset ESI (source index) À destination de l’offset EDI (dest. index)
Les commandes incrémentent / décrémentent les index AUTOMATIQUEMENT Selon le drapeau D (Direction) D=0 (instruction CLD) : les index augmentent D=1 (instruction STD) : les index diminuent
Département Informatique 24
Modification de chaîneC1: .ascii "abcd"
.textstart:
movl $C1,%esi # esi pointe sur C1movl $C1,%edi # edi pointe sur C1 cld # on incrémentemovl $4,%ecx # 4 itérations
Boucle:lodsb # al caractère suivantcmpb $’a,%al # al ≥ ‘a ?jb maj # non déjà en
majusculesubb $32,%al # passe en majuscule
maj:stosb # range al dans C1loop Boucle# ici, C1 contient "ABCD"
Département Informatique 25
Copie de chaîneC1: .ascii "abcd"C2: .ascii "efgh"
.textstart:
movl $C1,%esi # esi pointe sur C1movl $C2,%edi # edi pointe sur C2 cld # on incrémentemovl $4,%ecx # 4 itérations
Boucle:movsb # (es:esi) (es:edi)loop Boucle
# ici, C2 contient "abcd"
Département Informatique 26
Comparaison de chaînesC1: .ascii "abcd"C2: .ascii "abce"
.textstart:
movl $C1,%esi # esi pointe sur C1movl $C2,%edi # edi pointe sur C2 cld # on incrémentemovl $4,%ecx # 4 itérations
Boucle:cmpsb # (es:esi) ? (es:edi)ja Grand # si (es:esi) > (es:edi)jb Petit # si (es:esi) < (es:edi)loop Bouclejmp Egal
# dans cet exemple, on saute à Petit car abcd<abce
Département Informatique 27
Analyse de chaîneC1: .ascii "abcd"
.textstart:
movl $C1,%edi # edi pointe sur C1cld # on incrémentemovl $4,%ecx # 4 itérations maxmovb $’b,%al # cherche le caractère ‘bmovb $0,%ah # ah 0
Boucle:incb %ah # ah ah + 1scasb # al ? caractère suivantjb Fin # si < loop Boucle
Fin:
# ici ah contient 3 (position de ‘c, 1er<‘b)
Département Informatique 28
Contenu du cours
Introduction
Sauts inconditionnels
Sauts conditionnels
Les boucles
Opérations sur les chaînes
Automatisation des chaînes
Département Informatique 29
Automatisation
Très souvent, on opère sur toute la chaîne Nombre d’opérations connu Il existe 3 préfixes d’instructions de chaîne :
rep repe / repz (cmps et scas uniquement) repne / repnz (cmps et scas uniquement)
Ces préfixes modifient l’instruction : Ne sont pas de « vraies » instructions Exécution ECX fois de suite Ou tant que Z=1/0 (cmps et scas uniquement)
Département Informatique 30
Copie de chaîne automatisée
C1: .ascii "abcd"C2: .ascii "efgh"
.textstart:
movl $C1,%esi # esi pointe sur C1movl $C2,%edi # edi pointe sur C2 cld # on incrémentemovl $4,%ecx # 4 itérationsrep movsb # (es:esi)
(es:edi)
# ici, C2 contient "abcd"
Département Informatique 31
Comparaison de chaînes automatisée
C1: .ascii "abcd"C2: .ascii "abce"
.textstart:
movl $C1,%esi # esi pointe sur C1movl $C2,%edi # edi pointe sur C2 cld # on incrémentemovl $4,%ecx # 4 itérationsrepe cmpsb # (es:esi) ?= (es:edi)ja Grand # si (es:esi) > (es:edi)jb Petit # si (es:esi) < (es:edi)jmp Egal
# dans cet exemple, on saute à Petit car abcd<abce
Département Informatique 32
Initialisation d’un bloc mémoire
C1: .space 10000,0.text
start:movl $C1,%edi # edi pointe sur C1cld # on incrémentemovl $10000,%ecx # 10000
itérationsmovb $0xFF,%al # al 255rep stosb # (es:edi) al
# ici, C1 pointe sur un bloc de 10000 fois # « 255 »# C’est la méthode la plus rapide connue…