answerstoquestions
7.29 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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
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])
quels sont les registres utilisés pour le for ? les registres 54 (i) et 17
(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)
Comment est stocké le format du printf ? ?pas bien compris la question?
le printf est stocké dans une fonction à l'adresse 0xb7242f00 ?
/////////////////////////////////////////////////////////////////////////////////////// 4/5 ///////////////////////////////////////////////////////////////////////////
Le code du petit programme en assembleur (64 bits) :
.file "tramedepile.c"
.section .rodata
.LC0:
.string "a+b=%d\n"
.text
.globl addition
.type addition, @function
addition:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $32, %rsp
movl %edi, -20(%rbp)
movl %esi, -24(%rbp)
movl -20(%rbp), %edx
movl -24(%rbp), %eax
addl %edx, %eax
movl %eax, -4(%rbp)
movl -4(%rbp), %eax
movl %eax, %esi
movl $.LC0, %edi
movl $0, %eax
call printf
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size addition, .-addition
.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
movl $1, %esi
movl $1, %edi
call addition
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE1:
.size main, .-main
.ident "GCC: (Debian 4.9.2-10) 4.9.2"
.section .note.GNU-stack,"",@progbits
rip (8 octets)
rpb (8 octets)
eax/2 (4 octets)
.. (4 octets)
.. (4 octets)
.. (4 octets)
edi/1 (4 octets)
esi/1 (4 octets)
.. (4 octets)
en (normalement) 32 bits :
.file "tramedepile32.c"
.section .rodata
.LC0:
.string "a+b=%d\n"
.text
.globl addition
.type addition, @function
addition:
pushl %ebp
movl %esp, %ebp
subl $40, %esp
movl 12(%ebp), %eax
movl 8(%ebp), %edx
leal (%edx,%eax), %eax
movl %eax, -12(%ebp)
movl $.LC0, %eax
movl -12(%ebp), %edx
movl %edx, 4(%esp)
movl %eax, (%esp)
call printf
leave
ret
.size addition, .-addition
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
movl $1, 4(%esp)
movl $1, (%esp)
call addition
movl $0, %eax
leave
ret
.size main, .-main
.ident "GCC: (Debian 4.4.5-8) 4.4.5"
.section .note.GNU-stack,"",@progbits
1 (4 octets)
1 (4 octets)
eip (4 octets)
ebp (4 octets)
-- (4 octets)
-- (4 octets)
eax/2 (4 octets)
-- (4 octets)
-- (4 octets)
-- (4 octets)
-- (4 octets)
-- (4 octets)
edx/2 (4 octets)
eax/LCO (4 octets)