gcc对c语言中的switch的优化 在这里:
http://simohayha.iteye.com/admin/show/146825
接着用上次的代码 switch.c
int switch_eg(int x)
{
int result = x;
switch (x) {
case 100:
result *= 13;
break;
case 102:
result += 10;
/* Fall through */
case 103:
result += 11;
break;
case 104:
case 106:
result *= result;
break;
default:
result = 0;
}
return result;
}
我们先键入下面的命令:
cc -O2 -c switch.c
然后新建一个main.c的文件,内容为:
int main()
{
return switch_eg(102);
}
然后再键入
cc -O2 -o switch switch.o main.c
这时会生成一个switch的二进制文件,我们将它反汇编:
objdump -d switch
会生成很多代码,我这里只把重要的贴出来:
08048350 <switch_eg>:
8048350: 55 push %ebp
8048351: 89 e5 mov %esp,%ebp
8048353: 8b 45 08 mov 0x8(%ebp),%eax
8048356: 8d 50 9c lea -0x64(%eax),%edx
8048359: 83 fa 06 cmp $0x6,%edx
804835c: 76 04 jbe 8048362 <switch_eg+0x12>
804835e: 5d pop %ebp
804835f: 31 c0 xor %eax,%eax
8048361: c3 ret
8048362: ff 24 95 80 84 04 08 jmp *0x8048480(,%edx,4)
8048369: 0f af c0 imul %eax,%eax
804836c: 5d pop %ebp
804836d: 8d 76 00 lea 0x0(%esi),%esi
8048370: c3 ret
8048371: 5d pop %ebp
8048372: b8 72 00 00 00 mov $0x72,%eax
8048377: c3 ret
8048378: 5d pop %ebp
8048379: b8 7b 00 00 00 mov $0x7b,%eax
804837e: 66 90 xchg %ax,%ax
8048380: c3 ret
8048381: 5d pop %ebp
8048382: b8 14 05 00 00 mov $0x514,%eax
注意看8048362这一行.这行就是进入跳转表的汇编代码,现在我们再进入test程序的调试:
gdb test
然后键入:
x/6w 0x8048480
这个命令是打印出从地址0x8048480开始的6个四字节的地址的内容.
会显示出下面的地址:
0x8048480: 0x08048381 0x0804835e 0x08048378 0x08048371
0x8048490: 0x08048369 0x0804835e
也就是说0x8048480里面存储的是0x08048381,0x08048384里面存储的是0x0804835e,然后是 0x08048378.....
这样的话,通过8048362那边的计算,就可以直接跳转到某个地址,从而把这个地址所存储的内容提取出来.
可以通过这些地址前去上面的代码里面找:
0x08048381 : case 100
0x0804835e : case 101 (不存在所以跳转到default)
0x08048378 :case 102
0x08048371 :case 103
0x08048369 : 这边要注意,由于104是空语句,因此104 和106的case语句,编译器进行了合并,因此这边 即是 case 104也是case 106.
0x0804835e :case 105 (不存在所以跳转到default)
通过反汇编和调试信息,对switch的跳转表理解的更清晰了..
分享到:
相关推荐
switch 语句是 C 语言中处理多路选择问题的一种更直观和有效的手段。在实际应用中,要在多种情况中选择一种情况,执行某一部分语句。当然可以使用嵌套的 if , if else 语句来处理,但其分支过多,程序冗长,难读,...
本教学案例分析PPT学习教案的主要目的是帮助中职计算机专业学生学习C语言switch语句的格式、执行过程和应用,达到掌握switch语句的格式、理解switch语句的执行过程、掌握阅读、调试switch程序的能力、掌握switch语句...
掌握 switch 语句的基本格式、理解 switch 语句的执行过程、掌握利用 switch 语句编写分支选择语句、将其他学科中的知识融会贯通等是教学的重点和难点。 五、教法与学法 本课件采用了师生交流、归纳小结、提出问题...
C语言switch语句是多分支选择语句,在实际应用中需要在多种情况中选择一种情况,执行某一部分语句。switch语句是C语言中处理多路选择问题的一种更直观和有效的手段。 在测试某个表达式是否与一组常量表达式中的某...
switch语句是C++语言中的一种控制流语句,用于根据不同的条件执行不同的代码块。在本文中,我们将详细介绍switch语句的执行过程、注意要点、例题讲解和作业等。 一、switch语句的执行过程 switch语句的执行过程...
38.java中的switch语句.zip38.java中的switch语句.zip38.java中的switch语句.zip38.java中的switch语句.zip38.java中的switch语句.zip38.java中的switch语句.zip38.java中的switch语句.zip38.java中的switch语句.zip...
### C 语言中的 Switch 语句详解 #### 一、Switch 语句的基本概念与语法结构 Switch 语句是 C 语言中的一种选择结构,主要用于实现多分支选择的功能。其基本语法结构如下: ```c switch (表达式) { case 常量...
本文主要给大家介绍了关于Golang中switch和select用法的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 一、switch语句 switch语句提供了一个多分支条件执行的方法。每一个case可以携带一个表达式...
本篇文章将深入探讨C语言中的if语句和switch语句,这两种选择结构是控制程序流程的重要工具,使得代码可以根据不同的条件执行不同的操作。 首先,我们来详细了解一下if语句。if语句是基于条件执行特定代码块的基础...
C语言中的switch语句基本用法 switch语句是C语言中的一种多分支选择语句,能够简化代码,提高代码的可读性和维护性。下面将详细介绍switch语句的基本用法和应用。 switch语句的基本格式 switch语句的基本格式如下...
C语言中分支结构:if语句、if-else语句和switch语句的使用方法 C语言中分支结构是一种非常基本但非常重要的编程结构,它允许程序根据条件执行不同的代码块。在C语言中,分支结构有三种基本类型:if语句、if-else...
switch语句的普通用法很简单,如下: var a = 3; switch (a) { case 1: console.log(a); break; case 2: case 3: console.log(a); break; default: break; } 这里a和case列表中从上而下逐一做比较,如果...
c语言程序设计教程(第二版)谭浩强,经典例题,对于学习c语言有很大帮助
switch语句的使用例子
javascript,switch语句,判断年龄段
JavaScript中的`switch`语句是一种条件控制结构,用于执行基于不同条件的多个代码块。它提供了比`if...else if...else`结构更简洁、更易读的代码编写方式,尤其在处理多分支选择时。在本练习中,我们将深入探讨`...
SWITCH语句在MATLAB中的应用,条件一成立,执行条件一,条件二成立执行条件二语句,否则跳出循环。
本文将深入探讨switch语句的使用、语法、特点以及在不同编程语言中的差异,帮助你全面理解并熟练运用这一重要的编程工具。 1. **switch语句的基本概念** switch语句是条件控制结构的一种,它允许程序根据不同的...
C语言switch语句是一种多分支选择语句,用于在多种情况中选择一种情况,执行某一部分语句。switch语句的主要特点是可以根据表达式的值来选择执行的分支,且可以使用break语句来退出switch结构。 switch语句的基本...
在C语言中,`switch`语句是一种流程控制结构,用于根据不同的条件执行相应的代码块。它提供了一种更简洁的方式来替代多个`if...else if...else`语句。在这个程序设计实例中,我们看到一个如何巧妙使用`switch`语句的...