Bonjour,
Le programme en assembleur suivant :
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
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
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 int f(int x){return ++x;} int main(){ int x=1; x=f(x); }
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
4
5
6
7 # là movl $1, -4(%rbp) # là movl -4(%rbp), %eax # et là movl %eax, %edi
Quelqu'un a-t-il une explication ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 movl %edi, -4(%rbp) addl $1, -4(%rbp)
Partager