回答編集履歴

2

補足追記

2019/10/10 00:52

投稿

Y.H.
Y.H.

スコア7918

test CHANGED
@@ -24,6 +24,258 @@
24
24
 
25
25
  ```
26
26
 
27
+ 2019/10/10 補足として追記
28
+
29
+ それぞれのソースから同じアセンブリコードが生成されることを確認
30
+
31
+ ※Win10 1803 WSLにてgcc を使用
32
+
33
+
34
+
35
+ ```
36
+
37
+ $ # 元のソース
38
+
39
+ $ cat -n main.c
40
+
41
+ 1 #include <stdio.h>
42
+
43
+ 2
44
+
45
+ 3 void main(void){
46
+
47
+ 4 int Move=1;
48
+
49
+ 5 int A;
50
+
51
+ 6 if (Move > 0 && ++Move > 40) {
52
+
53
+ 7 Move = 0;
54
+
55
+ 8 A=10;
56
+
57
+ 9 }
58
+
59
+ 10 }
60
+
61
+ $ # if文を分解したソース
62
+
63
+ $ cat -n main2.c
64
+
65
+ 1 #include <stdio.h>
66
+
67
+ 2 void main(void){
68
+
69
+ 3 int Move=1;
70
+
71
+ 4 int A;
72
+
73
+ 5 if (Move > 0) {
74
+
75
+ 6 Move=Move+1;
76
+
77
+ 7 if (Move > 40) {
78
+
79
+ 8 Move = 0;
80
+
81
+ 9 A=10;
82
+
83
+ 10 }
84
+
85
+ 11 }
86
+
87
+ 12 }
88
+
89
+ ```
90
+
91
+
92
+
93
+ - それぞれコンパイルしアセンブリコードを生成
94
+
95
+
96
+
97
+ ```
98
+
99
+ $ gcc -S main.c
100
+
101
+ $ ll main.s
102
+
103
+ -rw-rw-rw- 1 root root 498 10月 10 09:19 main.s
104
+
105
+ $ gcc -S main2.c
106
+
107
+ $ ll main2.s
108
+
109
+ -rw-rw-rw- 1 root root 499 10月 10 09:19 main2.s
110
+
111
+ ```
112
+
113
+
114
+
115
+ - アセンブリコード - 元のソース
116
+
117
+
118
+
119
+ ```
120
+
121
+ $ cat -n main.s
122
+
123
+ 1 .file "main.c"
124
+
125
+ 2 .text
126
+
127
+ 3 .globl main
128
+
129
+ 4 .type main, @function
130
+
131
+ 5 main:
132
+
133
+ 6 .LFB0:
134
+
135
+ 7 .cfi_startproc
136
+
137
+ 8 pushq %rbp
138
+
139
+ 9 .cfi_def_cfa_offset 16
140
+
141
+ 10 .cfi_offset 6, -16
142
+
143
+ 11 movq %rsp, %rbp
144
+
145
+ 12 .cfi_def_cfa_register 6
146
+
147
+ 13 movl $1, -8(%rbp)
148
+
149
+ 14 cmpl $0, -8(%rbp)
150
+
151
+ 15 jle .L3
152
+
153
+ 16 addl $1, -8(%rbp)
154
+
155
+ 17 cmpl $40, -8(%rbp)
156
+
157
+ 18 jle .L3
158
+
159
+ 19 movl $0, -8(%rbp)
160
+
161
+ 20 movl $10, -4(%rbp)
162
+
163
+ 21 .L3:
164
+
165
+ 22 nop
166
+
167
+ 23 popq %rbp
168
+
169
+ 24 .cfi_def_cfa 7, 8
170
+
171
+ 25 ret
172
+
173
+ 26 .cfi_endproc
174
+
175
+ 27 .LFE0:
176
+
177
+ 28 .size main, .-main
178
+
179
+ 29 .ident "GCC: (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0"
180
+
181
+ 30 .section .note.GNU-stack,"",@progbits
182
+
183
+ ```
184
+
185
+
186
+
187
+ - アセンブリコード - if文を分解したソース
188
+
189
+
190
+
191
+ ```
192
+
193
+ $ cat -n main2.s
194
+
195
+ 1 .file "main2.c"
196
+
197
+ 2 .text
198
+
199
+ 3 .globl main
200
+
201
+ 4 .type main, @function
202
+
203
+ 5 main:
204
+
205
+ 6 .LFB0:
206
+
207
+ 7 .cfi_startproc
208
+
209
+ 8 pushq %rbp
210
+
211
+ 9 .cfi_def_cfa_offset 16
212
+
213
+ 10 .cfi_offset 6, -16
214
+
215
+ 11 movq %rsp, %rbp
216
+
217
+ 12 .cfi_def_cfa_register 6
218
+
219
+ 13 movl $1, -8(%rbp)
220
+
221
+ 14 cmpl $0, -8(%rbp)
222
+
223
+ 15 jle .L3
224
+
225
+ 16 addl $1, -8(%rbp)
226
+
227
+ 17 cmpl $40, -8(%rbp)
228
+
229
+ 18 jle .L3
230
+
231
+ 19 movl $0, -8(%rbp)
232
+
233
+ 20 movl $10, -4(%rbp)
234
+
235
+ 21 .L3:
236
+
237
+ 22 nop
238
+
239
+ 23 popq %rbp
240
+
241
+ 24 .cfi_def_cfa 7, 8
242
+
243
+ 25 ret
244
+
245
+ 26 .cfi_endproc
246
+
247
+ 27 .LFE0:
248
+
249
+ 28 .size main, .-main
250
+
251
+ 29 .ident "GCC: (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0"
252
+
253
+ 30 .section .note.GNU-stack,"",@progbits
254
+
255
+ ```
256
+
257
+
258
+
259
+ - アセンブリコードを比較
260
+
261
+
262
+
263
+ ```
264
+
265
+ $ diff main.s main2.s
266
+
267
+ 1c1
268
+
269
+ < .file "main.c"
270
+
271
+ ---
272
+
273
+ > .file "main2.c"
274
+
275
+ $
276
+
277
+ ```
278
+
27
279
  ___
28
280
 
29
281
 

1

コメントを受けて追記

2019/10/10 00:52

投稿

Y.H.
Y.H.

スコア7918

test CHANGED
@@ -1,6 +1,58 @@
1
+ コメントを受けて追記
2
+
3
+ if文を分けて全く同じ動作のコードにしてみた。
4
+
5
+ これでもわからなかったら具体的にどこがわからないか質問に追記ください。
6
+
7
+
8
+
9
+ ```
10
+
11
+ if (Move > 0) {
12
+
13
+ Move=Move+1;
14
+
15
+ if (Move > 40) {
16
+
17
+ Move = 0;
18
+
19
+ A=10;
20
+
21
+ }
22
+
23
+ }
24
+
25
+ ```
26
+
27
+ ___
28
+
29
+
30
+
1
31
  コメント入れてみた。
2
32
 
3
33
  これでもわからなかったら具体的にどこがわからないか質問に追記ください。
34
+
35
+
36
+
37
+ ```
38
+
39
+ if (Move > 0) {
40
+
41
+ Move=Move+1;
42
+
43
+ if (Move > 40) {
44
+
45
+ Move = 0;
46
+
47
+    A=10;
48
+
49
+ }
50
+
51
+ }
52
+
53
+ ```
54
+
55
+
4
56
 
5
57
 
6
58