answerstoquestions
3.16 KB
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
2.1) Chaine de compilation 1/5
1) les exe ont été créés et envoyés sur le depot lab
2) il n'est pas très propre car on initialise i à 0 et ensuite à 1
3) pensez-vous qu'il nécessaire d'optimiser le code ? Du moins, enlever l'initialisation de i à 0
après optimisation la taille est diminuée
-rw-r--r-- 1 pcwik apima3 572 Mar 18 15:27 compil1.c.011t.cfg
-rw-r--r-- 1 pcwik apima3 2051 Mar 18 15:27 compil1.c.011t.cfg.dot
-rw-r--r-- 1 pcwik apima3 309 Mar 18 15:42 compil1.c.169t.optimized
-rw-r--r-- 1 pcwik apima3 1605 Mar 18 15:42 compil1.c.169t.optimized.dot
Chaine de compilation 2/5
gcc :
@3 var_decl name: @6 type: @7 scpe: @8
@6 identifier_node strg: i lngt: 1
@11 modify_expr type: @7 op 0: @3 op 1: @28
@12 modify_expr type: @7 op 0: @3 op 1: @29
ci-dessus les deux lignes où i est mis à 0 puis à 1
et avec clang :
VarDecl 0x2c529d0 <col:1, col:5> col:5 used i 'int'
|-BinaryOperator 0x2c52a88 <line:7:1, col:3> 'int' '='
| |-DeclRefExpr 0x2c52a40 <col:1> 'int' lvalue Var 0x2c529d0 'i' 'int'
| `-IntegerLiteral 0x2c52a68 <col:3> 'int' 0
|-ForStmt 0x2c53d70 <line:8:1, line:4:41>
| |-BinaryOperator 0x2c52af8 <line:8:5, col:7> 'int' '='
| | |-DeclRefExpr 0x2c52ab0 <col:5> 'int' lvalue Var 0x2c529d0 'i' 'int'
| | `-IntegerLiteral 0x2c52ad8 <col:7> 'int' 1
Chaine de compilation 3/5 )
dans quel segment mémoire se trouve la variable i ? Elle se trouve dans la pile (virtual-stack-vars)
à quelle adresse se trouve la variable i ? La variable i se trouve à l'adresse contenue dans le registre 54 moins 4 octets.
(insn 5 4 6 3 (set (mem/c/i:SI (plus:SI (reg/f:SI 54 virtual-stack-vars)
(const_int -4 [0xfffffffffffffffc])) [0 i+0 S4 A32])
listez les instructions implantant l'instruction for :
mise à 1 de i : instruction 6
(insn 6 5 7 3 (set (mem/c/i:SI (plus:SI (reg/f:SI 54 virtual-stack-vars)
(const_int -4 [0xfffffffffffffffc])) [0 i+0 S4 A32])
(const_int 1 [0x1])) prog-cpp.c:5 -1
(nil))
l'incrementation de 1 : instruction 15
(insn 15 14 16 4 (parallel [
(set (mem/c/i:SI (plus:SI (reg/f:SI 54 virtual-stack-vars)
(const_int -4 [0xfffffffffffffffc])) [0 i+0 S4 A32])
(plus:SI (mem/c/i:SI (plus:SI (reg/f:SI 54 virtual-stack-vars)
(const_int -4 [0xfffffffffffffffc])) [0 i+0 S4 A32])
(const_int 1 [0x1])))
(clobber (reg:CC 17 flags))
]) prog-cpp.c:5 -1
(nil))
la comparaison avec 10 : instruction 19
(insn 19 17 20 5 (set (reg:CCGC 17 flags)
(compare:CCGC (mem/c/i:SI (plus:SI (reg/f:SI 54 virtual-stack-vars)
(const_int -4 [0xfffffffffffffffc])) [0 i+0 S4 A32])
(const_int 10 [0xa]))) prog-cpp.c:5 -1
(nil))
le jump : instruction 20
(jump_insn 20 19 21 5 (set (pc)
(if_then_else (le (reg:CCGC 17 flags)
(const_int 0 [0]))
(label_ref 18)
(pc))) prog-cpp.c:5 -1
(nil)
il jump à 18 que l'on retrouve au dessus
(code_label 18 8 9 4 3 "" [1 uses])