`
simohayha
  • 浏览: 1404191 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

谈一下switch语句中的jump table

阅读更多
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的跳转表理解的更清晰了..
分享到:
评论

相关推荐

    C语言switch语句学习教案.pptx

    switch 语句是 C 语言中处理多路选择问题的一种更直观和有效的手段。在实际应用中,要在多种情况中选择一种情况,执行某一部分语句。当然可以使用嵌套的 if , if else 语句来处理,但其分支过多,程序冗长,难读,...

    C语言switch语句 ——教学案例分析PPT学习教案.pptx

    本教学案例分析PPT学习教案的主要目的是帮助中职计算机专业学生学习C语言switch语句的格式、执行过程和应用,达到掌握switch语句的格式、理解switch语句的执行过程、掌握阅读、调试switch程序的能力、掌握switch语句...

    C语言switch语句 ——教学案例分析PPT课件.pptx

    掌握 switch 语句的基本格式、理解 switch 语句的执行过程、掌握利用 switch 语句编写分支选择语句、将其他学科中的知识融会贯通等是教学的重点和难点。 五、教法与学法 本课件采用了师生交流、归纳小结、提出问题...

    C语言switch语句PPT课件.pptx

    C语言switch语句是多分支选择语句,在实际应用中需要在多种情况中选择一种情况,执行某一部分语句。switch语句是C语言中处理多路选择问题的一种更直观和有效的手段。 在测试某个表达式是否与一组常量表达式中的某...

    C++语言:switch语句最详细讲解.pdf

    switch语句是C++语言中的一种控制流语句,用于根据不同的条件执行不同的代码块。在本文中,我们将详细介绍switch语句的执行过程、注意要点、例题讲解和作业等。 一、switch语句的执行过程 switch语句的执行过程...

    38.java中的switch语句.zip

    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 语句学习

    ### C 语言中的 Switch 语句详解 #### 一、Switch 语句的基本概念与语法结构 Switch 语句是 C 语言中的一种选择结构,主要用于实现多分支选择的功能。其基本语法结构如下: ```c switch (表达式) { case 常量...

    Golang中switch语句和select语句的用法教程

    本文主要给大家介绍了关于Golang中switch和select用法的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 一、switch语句 switch语句提供了一个多分支条件执行的方法。每一个case可以携带一个表达式...

    c语言if语句实例_C语言if语句和switch语句实例_If..._

    本篇文章将深入探讨C语言中的if语句和switch语句,这两种选择结构是控制程序流程的重要工具,使得代码可以根据不同的条件执行不同的操作。 首先,我们来详细了解一下if语句。if语句是基于条件执行特定代码块的基础...

    C语言中的switch语句基本用法

    C语言中的switch语句基本用法 switch语句是C语言中的一种多分支选择语句,能够简化代码,提高代码的可读性和维护性。下面将详细介绍switch语句的基本用法和应用。 switch语句的基本格式 switch语句的基本格式如下...

    C语言中分支结构:if语句、if-else语句和switch语句的使用方法.docx

    C语言中分支结构:if语句、if-else语句和switch语句的使用方法 C语言中分支结构是一种非常基本但非常重要的编程结构,它允许程序根据条件执行不同的代码块。在C语言中,分支结构有三种基本类型:if语句、if-else...

    switch语句的妙用(必看篇)

    switch语句的普通用法很简单,如下: var a = 3; switch (a) { case 1: console.log(a); break; case 2: case 3: console.log(a); break; default: break; } 这里a和case列表中从上而下逐一做比较,如果...

    switch语句,算利润

    c语言程序设计教程(第二版)谭浩强,经典例题,对于学习c语言有很大帮助

    switch语句的使用例子

    switch语句的使用例子

    switch语句通过用户输入的年龄判断年龄段并输出

    javascript,switch语句,判断年龄段

    switch语句

    JavaScript中的`switch`语句是一种条件控制结构,用于执行基于不同条件的多个代码块。它提供了比`if...else if...else`结构更简洁、更易读的代码编写方式,尤其在处理多分支选择时。在本练习中,我们将深入探讨`...

    MATLAB实现SWITCH语句

    SWITCH语句在MATLAB中的应用,条件一成立,执行条件一,条件二成立执行条件二语句,否则跳出循环。

    switch语句大全下载

    本文将深入探讨switch语句的使用、语法、特点以及在不同编程语言中的差异,帮助你全面理解并熟练运用这一重要的编程工具。 1. **switch语句的基本概念** switch语句是条件控制结构的一种,它允许程序根据不同的...

    C语言switch语句ppt课件.ppt

    C语言switch语句是一种多分支选择语句,用于在多种情况中选择一种情况,执行某一部分语句。switch语句的主要特点是可以根据表达式的值来选择执行的分支,且可以使用break语句来退出switch结构。 switch语句的基本...

    c语言程序设计 switch语句

    在C语言中,`switch`语句是一种流程控制结构,用于根据不同的条件执行相应的代码块。它提供了一种更简洁的方式来替代多个`if...else if...else`语句。在这个程序设计实例中,我们看到一个如何巧妙使用`switch`语句的...

Global site tag (gtag.js) - Google Analytics