在c语言中switch语句会被实现为一个跳转表,跳转表是一个数组,这个数组里面存的都是地址,也就是说只要你传递给它一个i,他就会返回给你,你所需要跳转的地址,这样做得好处就是执行语句的时间和条件的个数无关..不过在gcc里面他也只是条件数大于4个,才会生成这个跳转表.
请看下面的代码:
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;
}
这只是一段简单的switch语句,下面我们用一段c代码来描述汇编代码所要做得事情.
code *jt[7] = {
loc_A, loc_def, loc_B, loc_C,
loc_D, loc_def, loc_D
};
int switch_eg_impl(int x)
{
unsigned xi = x - 100;
int result = x;
if (xi > 6)
goto loc_def;
/* Next goto is not legal C */
goto jt[xi];
loc_A: /* Case 100 */
result *= 13;
goto done;
loc_B: /* Case 102 */
result += 10;
/* Fall through */
loc_C: /* Case 103 */
result += 11;
goto done;
loc_D: /* Cases 104, 106 */
result *= result;
goto done;
loc_def: /* Default case*/
result = 0;
done:
return result;
}
看上面的代码就很清楚了,它会对传进来的值与100进行一个减法,然后再将这个值传进switch语句.
而真实的汇编代码是怎么样的呢,我们可以看看:
switch_eg:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax //这边得到传进来的参数
leal -100(%eax), %edx //这边将得到的参数和100做差
cmpl $6, %edx //这边和6比较,如果大于6说明下面的条件没有满足的所以默认进入default
jbe .L11
.L2:
popl %ebp
xorl %eax, %eax
ret
.p2align 4,,7
.L11:
jmp *.L7(,%edx,4) //这边也就是我们上面伪码所描述的那个jt[xi]
.section .rodata
.align 4
.align 4
.L7: //这边就是所构造的跳转表.
.long .L3
.long .L2
.long .L4
.long .L5
.long .L6
.long .L2
.long .L6
.text
.L6: // loc_D
imull %eax, %eax
popl %ebp
.p2align 4,,6
ret
.L5: //loc_c
popl %ebp
movl $114, %eax
.p2align 4,,6
ret
.L4: //loc_B
popl %ebp
movl $123, %eax
.p2align 4,,4
ret
.L3: //loc_A
popl %ebp
movl $1300, %eax
.p2align 4,,4
ret
分享到:
相关推荐
标题《C语言程序优化.pdf》指向的是一份专注于如何优化C语言程序的文档。文档内容涉及到了C语言中一些关键的编程结构和技巧,这些都是提高代码运行效率和性能的重要组成部分。 首先,文档中提到了C语言的循环控制...
在本压缩包“gcc.zip_C语言_DEMO_pickuyh”中,包含了一个关于C语言的基础测试Demo,旨在帮助用户熟悉C语言的基本语法和编程概念。C语言是一种强大的、高效的编程语言,广泛应用于系统编程、软件开发、设备驱动等多...
GCC支持的C语言扩展特性非常广泛,其中最重要的是类型发现、范围扩展等功能性扩展,以及一系列有助于生成高效代码的优化扩展。下面我们将逐一介绍这些特性。 ##### 1. 类型发现 类型发现是一种非常有用的特性,它...
通过实践这些案例,读者可以对C语言的语法、结构以及程序设计思想有更深入的理解。 在C语言的学习过程中,第一章通常会介绍C语言的基本概念和环境设置。这可能包括如何安装编译器,如GCC,以及如何编写、编译和运行...
理解指针的概念,学习如何声明、初始化和使用指针,以及了解指针在数组、字符串和函数中的应用,对深入C语言至关重要。 4. **数组与字符串**:数组是一系列相同类型的元素集合,而字符串是字符数组的特殊形式。了解...
- **控制结构**:C语言的控制结构包括选择结构(如if语句和switch语句)、循环结构(如for循环和while循环)以及跳转语句(如break和continue)。 ### 3. C语言高级特性 - **数组和指针**:数组是一种存储相同类型...
在学习过程中,谭浩强教授的课件以其通俗易懂的语言和丰富的实例,帮助读者逐步建立起对C语言的理解。通过这份资料,学习者不仅可以掌握C语言的基本语法,还能了解到如何运用C语言进行实际问题的解决。同时,课件中...
早期的C编译器如TurboC在DOS环境下非常流行,而现在,C编译器如GCC和Clang则支持更多的平台和特性,包括对Windows GUI环境的支持。随着计算机技术的发展,C语言也在不断演进,加入了更多现代编程特性,例如对宽字符...
1. **结构化编程**:C语言支持结构化编程思想,通过if语句、switch语句、while和for循环等控制结构,可以清晰地组织程序逻辑。 2. **类型系统**:C语言有丰富的数据类型,如整型(int)、字符型(char)、浮点型...
书中的源代码实例可能包含对指针的深入探讨,如指针变量的声明、指针运算、指针与数组、指针与函数等。 内存管理在C语言中占据了重要地位,学习如何动态分配和释放内存是每个C程序员的必修课。书中可能涵盖了malloc...
在本项目中,"C语言小游戏之‘雷霆战机’"是一个使用C语言编写的终端游戏,作为一门编程课程,特别是C语言课程的期末大作业,它旨在锻炼学生的编程能力、逻辑思维以及对C语言语法的深入理解。这个小游戏可能会包含...
### C语言简明教程知识点概览 #### 一、概述 ...以上是对《C语言简明教程》中涉及的主要知识点的概述,通过系统学习这些概念和技术,读者将能够掌握C语言的基础,并为进一步深入学习打下坚实的基础。
5. **单片机开发环境**:通常,开发C语言单片机程序需要集成开发环境(IDE),例如Keil uVision、IAR Embedded Workbench或GCC等。这些工具提供了代码编辑、编译、链接和下载到单片机的功能,同时也有调试器用于在...
综上所述,`register`关键字在C语言中曾经是一种重要的性能优化手段,但在现代编程实践中,它的使用已经变得相对少见。开发者应该依赖于现代编译器的优化能力,并遵循最佳实践来提升程序性能。希望本文能帮助你理解`...
资料中的"快乐无极软件园.htm"可能是提供了一些额外的学习资源链接或相关软件下载,如C语言编译器(如GCC或TDM-GCC)、调试工具(如GDB)或者其他辅助学习工具,这些都能进一步增强学习体验。 总的来说,《C语言...
这有助于加深对C语言基础语法的理解。 #### 实验三:条件判断与循环结构 进一步深入探索if语句、switch-case语句以及while/do-while/for三种不同类型的循环结构,并结合具体实例进行实践操作,如猜数字游戏、求...
1. **基础知识**:讲解C语言的历史、特点及环境搭建,如安装GCC编译器,设置路径,创建和运行第一个C程序——经典的"Hello, World!"。 2. **语法结构**:介绍C语言的基本语法,包括变量、常量、数据类型(如int、...
GCC不仅支持C语言,还支持C++和其他编程语言。安装完成后,可以通过命令行工具输入"gcc --version"来检查编译器是否安装成功。 三、C程序的基本结构 一个C程序通常包含预处理指令、函数定义、主函数以及其他辅助...
《谭浩强C语言》是C语言学习者的...在深入学习过程中,建议结合编程环境(如GCC或Visual Studio)进行实践,同时参考其他在线资源和社区(如Stack Overflow)来解决疑问,这样将使你的C语言学习之旅更加充实和有效。