资料介绍
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程序设计语句和描述方式 53次下载
- 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次下载
- 详解TIA Portal SCL编程语言中的IF语句 1.6k次阅读
- 深入理解C语言:循环语句的应用与优化技巧 1.2k次阅读
- 技术干货驿站 ▏深入理解C语言:掌握C语言条件判断,从if到switch的应用 1.4k次阅读
- assign语句和always语句的用法 4.7k次阅读
- C语言的break转移语句讲解 1.4k次阅读
- Rust的 match 语句用法 1.7k次阅读
- 加速循环语句的C编码技巧 1.3k次阅读
- KUKA 机器人编程语句SWITCH介绍 9.1k次阅读
- 条件判断语句(if语句) 4.8k次阅读
- 什么是SystemVerilog-决策语句-if-else语句? 2.1k次阅读
- continue和break跳转语句介绍 2.8k次阅读
- 决策语句允许程序块的执行流程 1.7k次阅读
- 带初始化的if和switch语句详解 2k次阅读
- 基本语句编程的一些规则和建议 2.1k次阅读
- pic单片机io口控制教程之c语言编程实现 1.2w次阅读
下载排行
本周
- 1MDD品牌三极管BC807数据手册
- 3.00 MB | 次下载 | 免费
- 2MDD品牌三极管BC817数据手册
- 2.51 MB | 次下载 | 免费
- 3MDD品牌三极管D882数据手册
- 3.49 MB | 次下载 | 免费
- 4MDD品牌三极管MMBT2222A数据手册
- 3.26 MB | 次下载 | 免费
- 5MDD品牌三极管MMBTA56数据手册
- 3.09 MB | 次下载 | 免费
- 6MDD品牌三极管MMBTA92数据手册
- 2.32 MB | 次下载 | 免费
- 7STM32G474 HRTIME PWM 丢波问题分析与解决
- 1.00 MB | 次下载 | 3 积分
- 8新能源电动汽车高压线束的铜铝连接解决方案
- 2.71 MB | 次下载 | 2 积分
本月
- 1爱华AIWA HS-J202维修手册
- 3.34 MB | 37次下载 | 免费
- 2PC5502负载均流控制电路数据手册
- 1.63 MB | 23次下载 | 免费
- 3NB-IoT芯片厂商的资料说明
- 0.31 MB | 22次下载 | 1 积分
- 4H110主板CPU PWM芯片ISL95858HRZ-T核心供电电路图资料
- 0.63 MB | 6次下载 | 1 积分
- 5UWB653Pro USB口测距通信定位模块规格书
- 838.47 KB | 5次下载 | 免费
- 6技嘉H110主板IT8628E_BX IO电路图资料
- 2.61 MB | 4次下载 | 1 积分
- 7苏泊尔DCL6907(即CHK-S007)单芯片电磁炉原理图资料
- 0.04 MB | 4次下载 | 1 积分
- 8苏泊尔DCL6909(即CHK-S009)单芯片电磁炉原理图资料
- 0.08 MB | 2次下载 | 1 积分
总榜
- 1matlab软件下载入口
- 未知 | 935137次下载 | 10 积分
- 2开源硬件-PMP21529.1-4 开关降压/升压双向直流/直流转换器 PCB layout 设计
- 1.48MB | 420064次下载 | 10 积分
- 3Altium DXP2002下载入口
- 未知 | 233089次下载 | 10 积分
- 4电路仿真软件multisim 10.0免费下载
- 340992 | 191439次下载 | 10 积分
- 5十天学会AVR单片机与C语言视频教程 下载
- 158M | 183353次下载 | 10 积分
- 6labview8.5下载
- 未知 | 81602次下载 | 10 积分
- 7Keil工具MDK-Arm免费下载
- 0.02 MB | 73822次下载 | 10 积分
- 8LabVIEW 8.6下载
- 未知 | 65991次下载 | 10 积分
电子发烧友App





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