资料介绍
14.6 Switch语句
编译器通常将C语言中的Switch语句编译一个查找表(Table Lookup)以便跳转到合适的入口处。
下面的例子显示了编译器如何处理程序中的Switch语言的。
C源程序如下。
char * ConditionStr1(int condition)
{
switch(condition)
{
case 0: return “EQ”;
case 1: return “NE”;
case 2: return “CS”;
case 3: return “CC”;
case 4: return “MI”;
case 5: return “PL”;
case 6: return “VS”;
case 7: return “VC”;
case 8: return “HI”;
case 9: return “LS”;
case 10: return “GE”;
case 11: return “LT”;
case 12: return “GT”;
case 13: return “LE”;
case 14: return “”;
default: return 0;
}
}
编译后的结果如下。
ConditionStr1:
0000807C E1A01000 MOV r1,r0
》》》 SWITCH\#3 switch(condition)
00008080 E351000E CMP r1,#0xe
00008084 908FF101 ADDLS pc,pc,r1,LSL #2
00008088 EA00003B B 0x817c 《SWITCH\#20》
0000808C EA00000D B 0x80c8 《SWITCH\#5》
00008090 EA00000F B 0x80d4 《SWITCH\#6》
00008094 EA000011 B 0x80e0 《SWITCH\#7》
00008098 EA000013 B 0x80ec 《SWITCH\#8》
0000809C EA000015 B 0x80f8 《SWITCH\#9》
000080A0 EA000017 B 0x8104 《SWITCH\#10》
000080A4 EA000019 B 0x8110 《SWITCH\#11》
000080A8 EA00001B B 0x811c 《SWITCH\#12》
000080AC EA00001D B 0x8128 《SWITCH\#13》
000080B0 EA00001F B 0x8134 《SWITCH\#14》
000080B4 EA000021 B 0x8140 《SWITCH\#15》
000080B8 EA000023 B 0x814c 《SWITCH\#16》
000080BC EA000025 B 0x8158 《SWITCH\#17》
000080C0 EA000027 B 0x8164 《SWITCH\#18》
000080C4 EA000029 B 0x8170 《SWITCH\#19》
对于ARM代码,查找表的入口为4字节;Thumb代码的查找表入口为1或2个字节(当Case情况小于32时,使用入口为1字节的查找表)。所以当使用Switch语句时,应尽量较少Case分支。
另外,为了提高系统性能,也可以手工编写代码,形成程序跳转来避免使用Switch语句。
下面的例子显示对上面Switch分支语句的改写。
char * ConditionStr2(int condition)
{
if ((unsigned) condition 》= 15) return 0;
return
“EQ\0NE\0CS\0CC\0MI\0PL\0VS\0VC\0HI\0LS\0GE\0LT\0GT\0LE\0\0” +
3 * condition;
}
编译后的代码如下所示。
ConditionStr2:
00008188 E1A01000 MOV r1,r0
》》》 SWITCH\#26 if ((unsigned) condition 》= 15) return 0;
0000818C E351000F CMP r1,#0xf
00008190 3A000001 BCC 0x819c 《SWITCH\#27》
》》》 SWITCH\#26 if ((unsigned) condition 》= 15) return 0;
00008194 E3A00000 MOV r0,#0
》》》 SWITCH\#30 }
00008198 E12FFF1E BX r14
》》》 SWITCH\#26 if ((unsigned) condition 》= 15) return 0;
》》》 SWITCH\#27 return
0000819C E28F005C ADR r0,{pc}+0x64 ; #0x8200
000081A0 E3A02003 MOV r2,#3
000081A4 E0200291 MLA r0,r1,r2,r0
000081A8 EAFFFFFA B 0x8198 《SWITCH\#30》
》》》 SWITCH\#33 {
从两段汇编代码的分析可以看出,使用跳转表需要240bytes,而第二种做法只用了72bytes。
编译器通常将C语言中的Switch语句编译一个查找表(Table Lookup)以便跳转到合适的入口处。
下面的例子显示了编译器如何处理程序中的Switch语言的。
C源程序如下。
char * ConditionStr1(int condition)
{
switch(condition)
{
case 0: return “EQ”;
case 1: return “NE”;
case 2: return “CS”;
case 3: return “CC”;
case 4: return “MI”;
case 5: return “PL”;
case 6: return “VS”;
case 7: return “VC”;
case 8: return “HI”;
case 9: return “LS”;
case 10: return “GE”;
case 11: return “LT”;
case 12: return “GT”;
case 13: return “LE”;
case 14: return “”;
default: return 0;
}
}
编译后的结果如下。
ConditionStr1:
0000807C E1A01000 MOV r1,r0
》》》 SWITCH\#3 switch(condition)
00008080 E351000E CMP r1,#0xe
00008084 908FF101 ADDLS pc,pc,r1,LSL #2
00008088 EA00003B B 0x817c 《SWITCH\#20》
0000808C EA00000D B 0x80c8 《SWITCH\#5》
00008090 EA00000F B 0x80d4 《SWITCH\#6》
00008094 EA000011 B 0x80e0 《SWITCH\#7》
00008098 EA000013 B 0x80ec 《SWITCH\#8》
0000809C EA000015 B 0x80f8 《SWITCH\#9》
000080A0 EA000017 B 0x8104 《SWITCH\#10》
000080A4 EA000019 B 0x8110 《SWITCH\#11》
000080A8 EA00001B B 0x811c 《SWITCH\#12》
000080AC EA00001D B 0x8128 《SWITCH\#13》
000080B0 EA00001F B 0x8134 《SWITCH\#14》
000080B4 EA000021 B 0x8140 《SWITCH\#15》
000080B8 EA000023 B 0x814c 《SWITCH\#16》
000080BC EA000025 B 0x8158 《SWITCH\#17》
000080C0 EA000027 B 0x8164 《SWITCH\#18》
000080C4 EA000029 B 0x8170 《SWITCH\#19》
对于ARM代码,查找表的入口为4字节;Thumb代码的查找表入口为1或2个字节(当Case情况小于32时,使用入口为1字节的查找表)。所以当使用Switch语句时,应尽量较少Case分支。
另外,为了提高系统性能,也可以手工编写代码,形成程序跳转来避免使用Switch语句。
下面的例子显示对上面Switch分支语句的改写。
char * ConditionStr2(int condition)
{
if ((unsigned) condition 》= 15) return 0;
return
“EQ\0NE\0CS\0CC\0MI\0PL\0VS\0VC\0HI\0LS\0GE\0LT\0GT\0LE\0\0” +
3 * condition;
}
编译后的代码如下所示。
ConditionStr2:
00008188 E1A01000 MOV r1,r0
》》》 SWITCH\#26 if ((unsigned) condition 》= 15) return 0;
0000818C E351000F CMP r1,#0xf
00008190 3A000001 BCC 0x819c 《SWITCH\#27》
》》》 SWITCH\#26 if ((unsigned) condition 》= 15) return 0;
00008194 E3A00000 MOV r0,#0
》》》 SWITCH\#30 }
00008198 E12FFF1E BX r14
》》》 SWITCH\#26 if ((unsigned) condition 》= 15) return 0;
》》》 SWITCH\#27 return
0000819C E28F005C ADR r0,{pc}+0x64 ; #0x8200
000081A0 E3A02003 MOV r2,#3
000081A4 E0200291 MLA r0,r1,r2,r0
000081A8 EAFFFFFA B 0x8198 《SWITCH\#30》
》》》 SWITCH\#33 {
从两段汇编代码的分析可以看出,使用跳转表需要240bytes,而第二种做法只用了72bytes。
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- 51单片机实战教程之C语言基础(九 switch语句)
- Verilog教程之Verilog HDL程序设计语句和描述方式 47次下载
- C语言的switch case多分支选择语句的详细资料说明
- C++程序设计教程之程序设计初步资料说明 7次下载
- C++程序设计教程之语句的详细资料说明 1次下载
- C语言教程之使用选择结构设计C语言程序的资料说明 10次下载
- C语言程序设计教程之控制语句的详细资料说明 0次下载
- C语言程序设计教程之选择结构的资料讲解 11次下载
- C语言基础教程之语句的详细资料和实例说明 13次下载
- C语言教程之if语句的详细资料介绍免费下载 4次下载
- C语言程序设计实用教程之如何选择结构程序设计 6次下载
- C++语言程序设计时如何控制语句? 2次下载
- C语言教程之使用while语句求n! 14次下载
- Proteus之switch语句的应用 0次下载
- C++语言基础讲解视频Switch分支条件判断语句 7次下载
- 深入理解C语言:循环语句的应用与优化技巧 214次阅读
- 技术干货驿站 ▏深入理解C语言:掌握C语言条件判断,从if到switch的应用 403次阅读
- assign语句和always语句的用法 2718次阅读
- C语言的break转移语句讲解 742次阅读
- Rust的 match 语句用法 937次阅读
- 加速循环语句的C编码技巧 727次阅读
- KUKA 机器人编程语句SWITCH介绍 6832次阅读
- 条件判断语句(if语句) 3618次阅读
- 什么是SystemVerilog-决策语句-if-else语句? 1212次阅读
- continue和break跳转语句介绍 1691次阅读
- 决策语句允许程序块的执行流程 941次阅读
- 带初始化的if和switch语句详解 1411次阅读
- 基本语句编程的一些规则和建议 1626次阅读
- C语言中的goto语句怎么用?为什么反对使用 6697次阅读
- pic单片机io口控制教程之c语言编程实现 1.2w次阅读
下载排行
本周
- 148V到5KW无桥LLC双向逆变器的电路原理图免费下载
- 0.26 MB | 154次下载 | 10 积分
- 22KW逆变侧功率管的损耗如何进行计算详细公式免费下载
- 0.40 MB | 32次下载 | 2 积分
- 3高功率密度碳化硅MOSFET软开关三相逆变器损耗分析
- 2.27 MB | 30次下载 | 5 积分
- 4S7-200 可编程序控制器系统手册
- 12.81 MB | 4次下载 | 免费
- 5ATX电源 FSP_ATX-300PAF电路图资料
- 0.18 MB | 1次下载 | 2 积分
- 6IP6541_L 150uA 低功耗,集成多种快充输出协议中文资料
- 1.43 MB | 次下载 | 免费
- 7PC5010 单通道20V_10A低边高速驱动器技术手册
- 1.17 MB | 次下载 | 免费
- 8GSV2201D 带嵌入式MCU的DisplayPort 1.4到HDMI 2.0转换器规格书
- 0.67 MB | 次下载 | 2 积分
本月
- 148V到5KW无桥LLC双向逆变器的电路原理图免费下载
- 0.26 MB | 154次下载 | 10 积分
- 22KW逆变侧功率管的损耗如何进行计算详细公式免费下载
- 0.40 MB | 32次下载 | 2 积分
- 3高功率密度碳化硅MOSFET软开关三相逆变器损耗分析
- 2.27 MB | 30次下载 | 5 积分
- 4STM32F10x参考手册资料
- 13.64 MB | 12次下载 | 1 积分
- 5OAH0428 V1.0英文规格书
- 5.86 MB | 8次下载 | 免费
- 6光伏并网逆变器原理
- 7.31 MB | 6次下载 | 2 积分
- 7NS1081/NS1081S/NS1081Q USB 3.0闪存数据手册
- 0.40 MB | 4次下载 | 2 积分
- 8S7-200 可编程序控制器系统手册
- 12.81 MB | 4次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935132次下载 | 10 积分
- 2开源硬件-PMP21529.1-4 开关降压/升压双向直流/直流转换器 PCB layout 设计
- 1.48MB | 420064次下载 | 10 积分
- 3Altium DXP2002下载入口
- 未知 | 233089次下载 | 10 积分
- 4电路仿真软件multisim 10.0免费下载
- 340992 | 191422次下载 | 10 积分
- 5十天学会AVR单片机与C语言视频教程 下载
- 158M | 183352次下载 | 10 积分
- 6labview8.5下载
- 未知 | 81600次下载 | 10 积分
- 7Keil工具MDK-Arm免费下载
- 0.02 MB | 73818次下载 | 10 积分
- 8LabVIEW 8.6下载
- 未知 | 65990次下载 | 10 积分
电子发烧友App






创作
发文章
发帖
提问
发资料
发视频
上传资料赚积分
评论