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:

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);
}
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??

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]