Dans le cadre d'un cours d'informatique, il nous est demandé de "comprendre" du code assembleur "ligne par ligne". Ce code est généré par gcc -S -mpreferred-stack-boundary=2 prog.c. Nous possédons donc le code de base, et l'assembleur est celui généré automatiquement par la commande "gcc -s".
Le code de base est par exemple:
Ce code que l'on compile comme je l'ai expliqué plus tot donne le résultat suivant en assembleur... Seulement notre cours ne nous permet absolument pas de comprendre ce code, et c'est là que j'ai besoin de votre aide! Comment analyseriez vous ce code??
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 int sayhello(){ return printf("Hello World\n"); } int main() { int i = 0; i = sayhello(); printf("result %i\n", i); }
Voici le code assembleur:
----------
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 .file "programme1.c" .section .rodata .LC0: .string "Hello World\n" .text .globl sayhello .type sayhello, @function sayhello: pushl %ebp movl %esp, %ebp subl $4, %esp movl $.LC0, (%esp) call printf leave ret .size sayhello, .-sayhello .section .rodata .LC1: .string "result %i\n" .text .globl main .type main, @function main: pushl %ebp movl %esp, %ebp subl $12, %esp movl $0, -4(%ebp) call sayhello movl %eax, -4(%ebp) movl -4(%ebp), %eax movl %eax, 4(%esp) movl $.LC1, (%esp) call printf leave ret .size main, .-main .ident "GCC: (GNU) 4.0.3 (Ubuntu 4.0.3-1ubuntu5)" .section .note.GNU-stack,"",@progbits
Merci d'avance
Modération par Eric Sigoillot
Merci d'utiliser les balises [code]
Partager