想了解下 GCC 对 switch 的优化,但是不懂 AT&T 伪汇编指令,帮忙分析下

C 源码:

  1 void fun(char *ch){
  2     switch(*ch){
  3     case '-':
  4         *ch = __LINE__; break;
  5     case '0':
  6         *ch = __LINE__; break;
  7     case '1':
  8         *ch = __LINE__; break;
  9     case '2':
 10         *ch = __LINE__; break;
 11     case '3':
 12         *ch = __LINE__; break;
 13     case '4':
 14         *ch = __LINE__; break;
 15     case '5':
 16         *ch = __LINE__; break;
 17     case '6':
 18         *ch = __LINE__; break;
 19     case '7':
 20         *ch = __LINE__; break;
 21     case '8':
 22         *ch = __LINE__; break;
 23     case '9':
 24         *ch = __LINE__; break;
 25     case 'A':
 26         *ch = __LINE__; break;
 27     case 'B':
 28         *ch = __LINE__; break;
 29     case 'C':
 30         *ch = __LINE__; break;
 31     case 'D':
 32         *ch = __LINE__; break;
 33     case 'E':
 34         *ch = __LINE__; break;
 35     case 'F':
 36         *ch = __LINE__; break;
 37     case 'G':
 38         *ch = __LINE__; break;
 39     case 'H':
 40         *ch = __LINE__; break;
 41     case 'I':
 42         *ch = __LINE__; break;
 43     case 'J':
 44         *ch = __LINE__; break;
 45     case 'K':
 46         *ch = __LINE__; break;
 47     case 'L':
 48         *ch = __LINE__; break;
 49     case 'M':
 50         *ch = __LINE__; break;
 51     case 'N':
 52         *ch = __LINE__; break;
 53     case 'O':
 54         *ch = __LINE__; break;
 55     case 'P':
 56         *ch = __LINE__; break;
 57     case 'Q':
 58         *ch = __LINE__; break;
 59     case 'R':
 60         *ch = __LINE__; break;
 61     case 'S':
 62         *ch = __LINE__; break;
 63     case 'T':
 64         *ch = __LINE__; break;
 65     case 'U':
 66         *ch = __LINE__; break;
 67     case 'V':
 68         *ch = __LINE__; break;
 69     case 'W':
 70         *ch = __LINE__; break;
 71     case 'X':
 72         *ch = __LINE__; break;
 73     case 'Y':
 74         *ch = __LINE__; break;
 75     case 'Z':
 76         *ch = __LINE__; break;
 77     case 'a':
 78         *ch = __LINE__; break;
 79     case 'e':
 80         *ch = __LINE__; break;
 81     case 'f':
 82         *ch = __LINE__; break;
 83     case 'g':
 84         *ch = __LINE__; break;
 85     case 'i':
 86         *ch = __LINE__; break;
 87     case 'l':
 88         *ch = __LINE__; break;
 89     case 'o':
 90         *ch = __LINE__; break;
 91     case 't':
 92         *ch = __LINE__; break;
 93     case 'u':
 94         *ch = __LINE__; break;
 95     case 'v':
 96         *ch = __LINE__; break;
 97     case 'x':
 98         *ch = __LINE__; break;
 99     case 'b':
100         *ch = __LINE__; break;
101     case 'c':
102         *ch = __LINE__; break;
103     case 'd':
104         *ch = __LINE__; break;
105     case 'h':
106         *ch = __LINE__; break;
107     case 'j':
108         *ch = __LINE__; break;
109     case 'k':
110         *ch = __LINE__; break;
111     case 'm':
112         *ch = __LINE__; break;
113     case 'n':
114         *ch = __LINE__; break;
115     case 'p':
116         *ch = __LINE__; break;
117     case 'q':
118         *ch = __LINE__; break;
119     case 'r':
120         *ch = __LINE__; break;
121     case 's':
122         *ch = __LINE__; break;
123     case 'w':
124         *ch = __LINE__; break;
125     case 'y':
126         *ch = __LINE__; break;
127     case 'z':
128         *ch = __LINE__; break;
129     default:
130         *ch = 0;
131     }
132 }

执行 gcc -S -O2 -o switch.s switch.c 编译后得到的汇编代码:

  1     .file    "switch.c"
  2     .text
  3     .p2align 4,,15
  4     .globl    fun
  5     .type    fun, @function
  6 fun:
  7 .LFB0:
  8     .cfi_startproc
  9     movzbl    (%rdi), %eax
 10     subl    $45, %eax
 11     cmpb    $77, %al
 12     ja    .L2
 13     movzbl    %al, %eax
 14     jmp    *.L4(,%rax,8)
 15     .section    .rodata
 16     .align 8
 17     .align 4
 18 .L4:
 19     .quad    .L3
 20     .quad    .L2
 21     .quad    .L2
 22     .quad    .L5
 23     .quad    .L6
 24     .quad    .L7
 25     .quad    .L8
 26     .quad    .L9
 27     .quad    .L10
 28     .quad    .L11
 29     .quad    .L12
 30     .quad    .L13
 31     .quad    .L14
 32     .quad    .L2
 33     .quad    .L2
 34     .quad    .L2
 35     .quad    .L2
 36     .quad    .L2
 37     .quad    .L2
 38     .quad    .L2
 39     .quad    .L15
 40     .quad    .L16
 41     .quad    .L17
 42     .quad    .L18
 43     .quad    .L19
 44     .quad    .L20
 45     .quad    .L21
 46     .quad    .L22
 47     .quad    .L23
 48     .quad    .L24
 49     .quad    .L25
 50     .quad    .L26
 51     .quad    .L27
 52     .quad    .L28
 53     .quad    .L29
 54     .quad    .L30
 55     .quad    .L31
 56     .quad    .L32
 57     .quad    .L33
 58     .quad    .L34
 59     .quad    .L35
 60     .quad    .L36
 61     .quad    .L37
 62     .quad    .L38
 63     .quad    .L39
 64     .quad    .L40
 65     .quad    .L2
 66     .quad    .L2
 67     .quad    .L2
 68     .quad    .L2
 69     .quad    .L2
 70     .quad    .L2
 71     .quad    .L41
 72     .quad    .L42
 73     .quad    .L43
 74     .quad    .L44
 75     .quad    .L45
 76     .quad    .L46
 77     .quad    .L47
 78     .quad    .L48
 79     .quad    .L49
 80     .quad    .L50
 81     .quad    .L51
 82     .quad    .L52
 83     .quad    .L53
 84     .quad    .L54
 85     .quad    .L55
 86     .quad    .L56
 87     .quad    .L57
 88     .quad    .L58
 89     .quad    .L59
 90     .quad    .L60
 91     .quad    .L61
 92     .quad    .L62
 93     .quad    .L63
 94     .quad    .L64
 95     .quad    .L65
 96     .quad    .L66
 97     .text
 98     .p2align 4,,10
 99     .p2align 3
100 .L66:
101     movb    $-127, (%rdi)
102     ret
103     .p2align 4,,10
104     .p2align 3
105 .L65:
106     movb    $127, (%rdi)
107     ret
108     .p2align 4,,10
109     .p2align 3
110 .L64:
111     movb    $99, (%rdi)
112     ret
113     .p2align 4,,10
114     .p2align 3
115 .L63:
116     movb    $125, (%rdi)
117     ret
118     .p2align 4,,10
119     .p2align 3
120 .L62:
121     movb    $97, (%rdi)
122     ret
123     .p2align 4,,10
124     .p2align 3
125 .L61:
126     movb    $95, (%rdi)
127     ret
128     .p2align 4,,10
129     .p2align 3
130 .L60:
131     movb    $93, (%rdi)
132     ret
133     .p2align 4,,10
134     .p2align 3
135 .L59:
136     movb    $123, (%rdi)
137     ret
138     .p2align 4,,10
139     .p2align 3
140 .L58:
141     movb    $121, (%rdi)
142     ret
143     .p2align 4,,10
144     .p2align 3
145 .L57:
146     movb    $119, (%rdi)
147     ret
148     .p2align 4,,10
149     .p2align 3
150 .L56:
151     movb    $117, (%rdi)
152     ret
153     .p2align 4,,10
154     .p2align 3
155 .L55:
156     movb    $91, (%rdi)
157     ret
158     .p2align 4,,10
159     .p2align 3
160 .L54:
161     movb    $115, (%rdi)
162     ret
163     .p2align 4,,10
164     .p2align 3
165 .L53:
166     movb    $113, (%rdi)
167     ret
168     .p2align 4,,10
169     .p2align 3
170 .L52:
171     movb    $89, (%rdi)
172     ret
173     .p2align 4,,10
174     .p2align 3
175 .L51:
176     movb    $111, (%rdi)
177     ret
178     .p2align 4,,10
179     .p2align 3
180 .L50:
181     movb    $109, (%rdi)
182     ret
183     .p2align 4,,10
184     .p2align 3
185 .L49:
186     movb    $87, (%rdi)
187     ret
188     .p2align 4,,10
189     .p2align 3
190 .L48:
191     movb    $107, (%rdi)
192     ret
193     .p2align 4,,10
194     .p2align 3
195 .L47:
196     movb    $85, (%rdi)
197     ret
198     .p2align 4,,10
199     .p2align 3
200 .L46:
201     movb    $83, (%rdi)
202     ret
203     .p2align 4,,10
204     .p2align 3
205 .L45:
206     movb    $81, (%rdi)
207     ret
208     .p2align 4,,10
209     .p2align 3
210 .L44:
211     movb    $105, (%rdi)
212     ret
213     .p2align 4,,10
214     .p2align 3
215 .L43:
216     movb    $103, (%rdi)
217     ret
218     .p2align 4,,10
219     .p2align 3
220 .L42:
221     movb    $101, (%rdi)
222     ret
223     .p2align 4,,10
224     .p2align 3
225 .L41:
226     movb    $79, (%rdi)
227     ret
228     .p2align 4,,10
229     .p2align 3
230 .L40:
231     movb    $77, (%rdi)
232     ret
233     .p2align 4,,10
234     .p2align 3
235 .L39:
236     movb    $75, (%rdi)
237     ret
238     .p2align 4,,10
239     .p2align 3
240 .L38:
241     movb    $73, (%rdi)
242     ret
243     .p2align 4,,10
244     .p2align 3
245 .L37:
246     movb    $71, (%rdi)
247     ret
248     .p2align 4,,10
249     .p2align 3
250 .L36:
251     movb    $69, (%rdi)
252     ret
253     .p2align 4,,10
254     .p2align 3
255 .L35:
256     movb    $67, (%rdi)
257     ret
258     .p2align 4,,10
259     .p2align 3
260 .L34:
261     movb    $65, (%rdi)
262     ret
263     .p2align 4,,10
264     .p2align 3
265 .L33:
266     movb    $63, (%rdi)
267     ret
268     .p2align 4,,10
269     .p2align 3
270 .L32:
271     movb    $61, (%rdi)
272     ret
273     .p2align 4,,10
274     .p2align 3
275 .L31:
276     movb    $59, (%rdi)
277     ret
278     .p2align 4,,10
279     .p2align 3
280 .L30:
281     movb    $57, (%rdi)
282     ret
283     .p2align 4,,10
284     .p2align 3
285 .L29:
286     movb    $55, (%rdi)
287     ret
288     .p2align 4,,10
289     .p2align 3
290 .L28:
291     movb    $53, (%rdi)
292     ret
293     .p2align 4,,10
294     .p2align 3
295 .L27:
296     movb    $51, (%rdi)
297     ret
298     .p2align 4,,10
299     .p2align 3
300 .L26:
301     movb    $49, (%rdi)
302     ret
303     .p2align 4,,10
304     .p2align 3
305 .L25:
306     movb    $47, (%rdi)
307     ret
308     .p2align 4,,10
309     .p2align 3
310 .L24:
311     movb    $45, (%rdi)
312     ret
313     .p2align 4,,10
314     .p2align 3
315 .L23:
316     movb    $43, (%rdi)
317     ret
318     .p2align 4,,10
319     .p2align 3
320 .L22:
321     movb    $41, (%rdi)
322     ret
323     .p2align 4,,10
324     .p2align 3
325 .L21:
326     movb    $39, (%rdi)
327     ret
328     .p2align 4,,10
329     .p2align 3
330 .L20:
331     movb    $37, (%rdi)
332     ret
333     .p2align 4,,10
334     .p2align 3
335 .L19:
336     movb    $35, (%rdi)
337     ret
338     .p2align 4,,10
339     .p2align 3
340 .L18:
341     movb    $33, (%rdi)
342     ret
343     .p2align 4,,10
344     .p2align 3
345 .L17:
346     movb    $31, (%rdi)
347     ret
348     .p2align 4,,10
349     .p2align 3
350 .L16:
351     movb    $29, (%rdi)
352     ret
353     .p2align 4,,10
354     .p2align 3
355 .L15:
356     movb    $27, (%rdi)
357     ret
358     .p2align 4,,10
359     .p2align 3
360 .L14:
361     movb    $25, (%rdi)
362     ret
363     .p2align 4,,10
364     .p2align 3
365 .L13:
366     movb    $23, (%rdi)
367     ret
368     .p2align 4,,10
369     .p2align 3
370 .L12:
371     movb    $21, (%rdi)
372     ret
373     .p2align 4,,10
374     .p2align 3
375 .L11:
376     movb    $19, (%rdi)
377     ret
378     .p2align 4,,10
379     .p2align 3
380 .L10:
381     movb    $17, (%rdi)
382     ret
383     .p2align 4,,10
384     .p2align 3
385 .L9:
386     movb    $15, (%rdi)
387     ret
388     .p2align 4,,10
389     .p2align 3
390 .L8:
391     movb    $13, (%rdi)
392     ret
393     .p2align 4,,10
394     .p2align 3
395 .L7:
396     movb    $11, (%rdi)
397     ret
398     .p2align 4,,10
399     .p2align 3
400 .L6:
401     movb    $9, (%rdi)
402     ret
403     .p2align 4,,10
404     .p2align 3
405 .L5:
406     movb    $7, (%rdi)
407     ret
408     .p2align 4,,10
409     .p2align 3
410 .L3:
411     movb    $5, (%rdi)
412     ret
413     .p2align 4,,10
414     .p2align 3
415 .L2:
416     movb    $0, (%rdi)
417     ret
418     .cfi_endproc
419 .LFE0:
420     .size    fun, .-fun
421     .ident    "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
422     .section    .note.GNU-stack,"",@progbits

 

转载于:https://www.cnblogs.com/huye/p/4082883.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值