Bonjour,

Le programme en assembleur suivant :
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
 
_Z1fi:
.LFB0:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	%edi, -4(%rbp)
	addl	$1, -4(%rbp)
	movl	-4(%rbp), %eax
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	_Z1fi, .-_Z1fi
	.globl	main
	.type	main, @function
main:
.LFB1:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	subq	$16, %rsp
	movl	$1, -4(%rbp)
	movl	-4(%rbp), %eax
	movl	%eax, %edi
	call	_Z1fi
	movl	%eax, -4(%rbp)
	movl	$0, %eax
	leave
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
correspond à la sortie de g++ en assembleur du programme suivant en c++ :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
int f(int x){return ++x;}
 
int main(){
	int x=1;
	x=f(x);
}
Je ne comprends pas pourquoi le programme effectue la copie dans deux registre de la valeur de x et place de plus cette valeur sur la pile :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
# là
	movl	$1, -4(%rbp)
# là
	movl	-4(%rbp), %eax
# et là
	movl	%eax, %edi
d'autant que la fonction f ne semble pas utiliser la valeur passer par la pile et utilise à la place le contenu de edi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
	movl	%edi, -4(%rbp)
	addl	$1, -4(%rbp)
Quelqu'un a-t-il une explication ?