230 likes | 349 Views
Le préprocesseur. Laurent JEANPIERRE <jeanpl@iutc3.unicaen.fr> D’après le cours de Pascal FOUGERAY IUT de CAEN – Campus 3. Contenu du cours. Définition Les blocs de répétition Les tests Les macro-commandes Conclusion. Le préprocesseur. Jeu de commandes de l’assembleur
E N D
Le préprocesseur Laurent JEANPIERRE <jeanpl@iutc3.unicaen.fr> D’après le cours de Pascal FOUGERAY IUT de CAEN – Campus 3 Département Informatique
Contenu du cours • Définition • Les blocs de répétition • Les tests • Les macro-commandes • Conclusion Département Informatique
Le préprocesseur • Jeu de commandes de l’assembleur • Simplifient le code à écrire • Génèrent du code assembleur • Avant l’assemblage réel • Utilisent des directives de compilation • .rept,.irp, .irpc, .endr • .macro,.endm • .if, .else, .endif • .set Département Informatique
Contenu du cours • Définition • Les blocs de répétition • Les tests • Les macro-commandes • Conclusion Département Informatique
Blocs de répétition • Duplique n fois les lignes du bloc • Avec des variations mineures • Remplacement de valeurs • Commandes : • .rept<n> : bloc de répétition (n fois) • .endr : fin de bloc • .irp, .irpc : itération sur liste • .set : définition de valeur • = : modification de valeur Département Informatique
Le programme : Tab : .rept 5 .long 0 .endr Équivaut à : Tab : .long 0 .long 0 .long 0 .long 0 .long 0 Répétition simple : .rept Département Informatique
Le programme : Tab : .irp v,ab,cd,ef .ascii "\v" .endr Équivaut à : Tab : .ascii "ab" .ascii "cd" .ascii "ef" Itération sur liste : .irp Département Informatique
Le programme : Tab : .irpc v,abcdef .byte ‘\v,0 .endr Équivaut à : Tab : .byte ‘a,0 .byte ‘b,0 .byte ‘c,0 .byte ‘d,0 .byte ‘e,0 .byte ‘f,0 Itération sur chaîne : .irpc Département Informatique
Le programme : tmp : .set v,0 .irp re,ax,bx,\ cx,dx,bp,sp movw $v,%\re v = v+1 .endr Équivaut à : tmp : movw $0,%ax movw $1,%bx movw $2,%cx movw $3,%dx movw $4,%bx movw $5,%sx Utilisation de valeurs : .set / = Département Informatique
Contenu du cours • Définition • Les blocs de répétition • Les tests • Les macro-commandes • Conclusion Département Informatique
Portion de code conditionnelles • Possibilité d’activer / désactiver desportions de code assembleur • Commandes • .if <expression> : teste si expression ≠ 0 si oui, inclus le bloc suivant • .else : début du bloc sinon (expression = 0) • .endif : fin du bloc • Ou encore • .ifdef <symbol> : teste si symbol existe • .ifndef <symbol> : teste si symbol n’existe pas Département Informatique
LC0 : .string \ "starting main" _start : .if debug pushl LC0 call printf addl $4,%esp .endif pushl %ebp movl %esp, %ebp … Utilisation de conditionnelles (1) Département Informatique
Compilé avec as –-defsym debug=1 : LC0 : .string \ "starting main" _start : pushl LC0 call printf addl $4,%esp pushl %ebp movl %esp, %ebp … Utilisation de conditionnelles (2) Département Informatique
Compilé avec as -–defsym debug=0 : LC0 : .string \ "starting main" _start : pushl %ebp movl %esp, %ebp … Utilisation de conditionnelles (2) Département Informatique
Contenu du cours • Définition • Les blocs de répétition • Les tests • Les macro-commandes • Conclusion Département Informatique
Définition Une macro-commande est • Une nouvelle commande • Composée de plusieurs commandes • Ressemble à une fonction • Mais insérée à chaque utilisation • Peut être redéfinie Département Informatique
.macro debut pushl %ebp movl %esp, %ebp .endm .macro fin leave ret .endm .macro affiche chaine pushl $\chaine call printf addl $4, %esp .endm .data C1: .string "ABCD" C2: .string "EFGH" .text .global main main: debut affiche C1 affiche C2 fin Exemple (1) Département Informatique
.data C1: .string "ABCD" C2: .string "EFGH" .text .global main main: pushl %ebp movl %esp, %ebp pushl $C1 call printf addl $4, %esp pushl $C2 call printf addl $4, %esp leave ret Exemple (2) Département Informatique
.macro test exprcmpl $0, \exprjnevraifaux: …jmpsuitevrai: …suite:.endm main: test %eax test %ebx test %ecx main: cmpl $0, %eaxjnevraifaux: …jmp suitevrai: …suite: cmpl $0, %ebxjnevraifaux: …jmpsuitevrai: …suite: cmpl $0, %ecxjnevraifaux: …jmpsuitevrai: …suite: Le problème des labels Département Informatique
Solution… Pour résoudre ce problème : • Utilisation de labels locaux • Syntaxe : • 0:, 1:, 2:, 3:, 4:, 5:, 6:, 7:, 8:, 9: • jmp 2b : Saute au dernier label «2» défini • jmp 4f : Saute au prochain label «4» défini • Problèmes : • Source pas très lisible… • Facile de se tromper… • Pas très explicite Département Informatique
Contenu du cours • Définition • Les blocs de répétition • Les tests • Les macro-commandes • Conclusion Département Informatique
Conclusion Un programme avec macro-commandes est : • Plus simple • Plus court • Plus rapide (pas de call ni de ret) En contrepartie, le code généré sera : • Plus long car redondant(Duplication du code des macros) Département Informatique
Conclusion (2) • Il est possible de définir un langage presque complet avec des macros. • Instructions de haut niveau • Pas d’instructions complexes (boucles…) sans utiliser des mécanismes lourds (multiples mots-clés pour une même commande) • Ce n’est pas l’objectif de ce cours. Département Informatique