120 likes | 230 Views
Exemple de compilation. Merci à Laurent JEANPIERRE ref :http://asm.sourceforge.net/resources.html#tutorials. Objectifs. Les buts de ce cours sont : Etudier l’architecture x86 Comprendre le fonctionnement du m P Écrire des applications plus performantes. Un long fleuve tranquille.
E N D
Exemple de compilation Merci à Laurent JEANPIERRE ref :http://asm.sourceforge.net/resources.html#tutorials
Objectifs • Les buts de ce cours sont : • Etudier l’architecture x86 • Comprendre le fonctionnement du mP • Écrire des applications plus performantes
Un long fleuve tranquille Compilateur C C fichier Code assembleur Assembleur Code objet Linker Code executable
Chaîne de compilation gcc gcc -S gcc -c gcc as ld gcc -c gcc • Compiler un langage de haut niveau (C) Source C Assembleur Fichier Objet Programme Exécutable
Fichiers assembleurs de plusieurs processeurs différents • Un même exemple • coucou • Pour plusieurs compilateurs/processeurs • x86, Norme AT&T • x86, Norme Intel • Alpha • Solaris
Coucou Langage C gcc -S • coucou.c : #include <stdio.h> int main(int argc, char** argv) { printf("Coucou\n"); } • Compilation : • gcc –b<machine> -S coucou.c Source C Assembleur
coucoux86, Norme AT&T 1 .file "coucou.c" 2 .section .rodata 3 .LC0 : 4 .string "Coucou\n" 5 .text 6 .global main 7 .type main, @function 8 main : 9 pushl %ebp 10 movl %esp, %ebp 11 subl $8, %esp 12 andl $-16, %esp 13 movl $0, %eax 14 subl %eax, %esp 15 subl $12, %esp 16 pushl $.LC0 17 call printf 18 addl $16, %esp 19 leave 20 ret 21 .size main, .-main 22 .section .note .GNU-stack, "", @progbits 23 .ident "GCC: (GNU) 3.3.2 20031022"
coucou x86, Norme Intel 1 .file " coucou.c " 2 .intel_syntax 3 .section .rodata 4 .LC0 : 5 .string "Coucou\n" 6 .text 7 .global main 8 .type main, @function 9 main : 10 push %ebp 11 mov %ebp, %esp 12 sub %esp, 8 13 and %esp, -16 14 mov %eax, 0 15 sub %esp, %eax 16 sub %esp, 12 17 push OFFSET FLAT : .LC0 18 call printf 19 add %esp, 16 20 leave 21 ret 22 .size main, .-main 23 .section .note .GNU-stack, "", @progbits 24 .ident "GCC: (GNU) 3.3.2 20031022"
coucou Solaris 1 .file "hello.c" 2 gcc2_compiled.: 3 .section ".rodata" 4 .align 8 5 .LLC0 : 6 .asciz "coucou" 7 .section ".text" 8 .align 4 9 .global main 10 .type main, #function 11 .proc 020 12 main : 13 !#PROLOGUE# 0 14 save %sp,¡112,%sp 15 !#PROLOGUE# 1 16 sethi %hi (.LLC0), %o1 17 or %o1,%lo (.LLC0), %o0 18 call printf, 0 19 nop 20 .LL1 : 21 ret 22 restore 23 .LLfe1 : 24 .size main, .LLfe1-main 25 .ident "GCC: (GNU) 2.7.2.1.f.1"
Coucou Langage C avec DEVC++ dans Options du projet/Fichiers/Surcharge : $(CPP) -c main.c -o main.o $(CXXFLAGS) -Wa,-al,-ah,-as,-L >$@.lst info : http://sourceforge.net/forum/message.php?msg_id=3414372
editer main.o.lst … 14 0000 55 push ebp 15 0001 89E5 mov ebp, esp 16 0003 83EC08 sub esp, 8 17 0006 83E4F0 and esp, -16 18 0009 B8000000 mov eax, 0 18 00 19 000e 83C00F add eax, 15 20 0011 83C00F add eax, 15 21 0014 C1E804 shr eax, 4 22 0017 C1E004 sal eax, 4 23 001a 8945FC mov DWORD PTR [ebp-4], eax 24 001d 8B45FC mov eax, DWORD PTR [ebp-4] 25 0020 E8000000 call __alloca …
DDD • l'utilisation de DDD est très utile. • http://www.ibisc.fr/%7Edupont/SUPPORTS/DupontCours/SiteProg/ddd/ddd.pdf • http://www.dil.univ-mrs.fr/~garreta/generique/autres/UtiliserDDD.html