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 Compiler un langage de haut niveau (C) gcc gcc -S gcc -c gcc Source C Assembleur Fichier Objet Programme Exécutable gcc gcc -c as ld
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 coucou.c : #include <stdio.h> int main(int argc, char** argv) { printf("Coucou\n"); } Compilation : gcc –b<machine> -S coucou.c gcc -S 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++ rem : bien mettre main.c et non main.cpp GAS LISTING C:\DOCUME~1\DD\LOCALS~1\Temp/ccysaaaa.s page 1 1 .file "main.c" 2 .intel_syntax 3 .def ___main; .scl 2; .type 32; .endef 4 .section .rdata,"dr" 5 LC0: 6 0000 636F7563 .ascii "coucou\12\0" 6 6F750A00 7 LC1: 8 0008 50415553 .ascii "PAUSE\0" 8 4500 9 000e 0000 .text 10 .align 2 11 .globl _main 12 .def _main; .scl 2; .type 32; .endef 13 _main: 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 25 00 26 0025 E8000000 call ___main 26 00 27 002a C7042400 mov DWORD PTR [esp], OFFSET FLAT:LC0 27 000000 28 0031 E8000000 call _printf 28 00 29 0036 C7042408 mov DWORD PTR [esp], OFFSET FLAT:LC1 29 000000 30 003d E8000000 call _system 30 00 31 0042 B8000000 mov eax, 0 31 00 32 0047 C9 leave 33 0048 C3 ret 34 .def _system; .scl 3; .type 32; .endef 35 0049 90909090 .def _printf; .scl 2; .type 32; .endef 35 909090 GAS LISTING C:\DOCUME~1\DD\LOCALS~1\Temp/ccysaaaa.s page 2 DEFINED SYMBOLS *ABS*:00000000 main.c C:\DOCUME~1\DD\LOCALS~1\Temp/ccysaaaa.s:5 .rdata:00000000 LC0 C:\DOCUME~1\DD\LOCALS~1\Temp/ccysaaaa.s:7 .rdata:00000008 LC1 C:\DOCUME~1\DD\LOCALS~1\Temp/ccysaaaa.s:13 .text:00000000 _main UNDEFINED SYMBOLS ___main __alloca _system _printf 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