Keil C51的开关语句目标代码分析*

2015-11-23 02:35侯济恭
单片机与嵌入式系统应用 2015年7期
关键词:简式值域分支

侯济恭

(南威软件股份有限公司,泉州 362000)

Keil C51的开关语句目标代码分析*

侯济恭

(南威软件股份有限公司,泉州 362000)

分析目前流行的Keil C51对switch的编译方法及其编译效果。一般情况下,对于分支少于8的switch-case语句,目标代码为3层结构,即头码、转移控制码和开关体;对分支超过8个的较为复杂的switch-case,其目标代码分成4层,即头码、转移控制码、转移表和开关体。考虑到代码的执行效率,对应于选择因子的数据类型,转移控制码调用不同的系统库函数进行处理。

嵌入式系统;C51语言;汇编程序;编译器

引 言

对于嵌入式系统的单片机程序设计,其目标代码的运行效率是很令人关注的[1-2]。开关语句switch是C51程序设计中的一个重要语句,其逻辑清晰、层次结构分明、易读性和可维护性都很好,因此受到程序设计者的青睐。本文分析目前流行的Keil C51编译,分析其对switch的编译方法及其编译效果。

Keil C51编译switch-case语句,对于分支少于8的switch-case语句,其转移控制程序一般情况是将候选值(即case之常量)逐一比较,即编译成比较跳转指令形式,代码率很高;但对分支超过8个的较为复杂的switch-case语句,考虑到代码的执行效率,其转移控制程序要调用不同的系统库函数进行处理,其运行效率差强人意。

1 复杂式switch控制转移编译方法

分支大于8的情形,如果其Δx(即case值之间的差)小于255,则采用复杂式编译。因为51单片机是8位单片机,执行字符型运算只要一条指令,执行整型运算至少要两条指令,长型运算则要4条指令。基于代码的执行效率考量,Keil编译对于选择因子是字符型(8位)、整型(16位)或长型(32位),所提供的编译略有不同,对应的函数库分别是CCASE、ICCASE或LCASE。编译的目标代码虽然不同,但算法基本相同。

本编译方式所产生的开关语句switch结构分4层:开关头码、转移控制代码、转移表、开关体,其结构如图1所示。转移表由地址域和值域构成,按照case值上升排序,其结构如表1所列。

图1 开关语句编译后代码结构

表1 开关语句转移表

控制转移算法描述如下:

①扫描开关转移表;

②判断地址域是否为0;

③不为0,则跳转至⑤;

④表终止标志,计算switch出口地址在表中位置,跳转至⑥;

⑤ 判断值域是否与A相等,若不等,则跳转至①;

⑥ 从表中取出相应的入口,间址转移至分支处理程序。详细算法,参见图2。

图2 转移控制算法流程

下面选择字符型为例,说明复杂式switch编译的目标代码及其代码结构。

例:复杂式switch源程序段如下:

编译后的目标代码分解如下:

(1)转移控制库函数CCASE

(2)switch的开关头码

(3)转移表

(4)开关体

开关体代码物理排序没有变化。

(5)本层的出口地址

2 简式switch转移控制编译方法

对于分支不大于8的情形,且Δx小于255,则采用简单形式编译转移控制代码。方法如下:

设xn为n个case值,且xn>xn-1,则有

简式的算法是:将选择因子逐一与Δx相减,若结果为0,则转移到相应的分支处理程序。

例:简式switch源程序如下:

表2为case值的编排结果,相应的Δx如表3所列。

表2 示例中case常量排序

表3 示例中case常量的Δx

程序中减法采用补码加法运算,最后一项为第一个值域的值差。

(1)开关转移控制代码

(2)开关体

结 语

考虑到嵌入式软件运行效率要高的特点,Keil对switch的编译,根据选择因子的数据类型,采用4种方式。其中,简式编译效率最高,其设计方式比较精巧,很值得程序员学习[7,8]。但在简式switch程序中,程序员对case值的排列是毫无用处的,因此,当根据事件发生频度来设计程序时,最好采用if语句。对于复杂式的编译,其代码结构很符合程序设计的风格,即代码与数据分离,建立一个由地址域和值域构成的转移表,然后根据选择因子的数据类型,构造算法相同的扫描转移表完成代码的编译,算法简洁,但由于是顺序扫描,效率较差[3]。对于长型的选择因子,其编译后的代码较长,效率比较低,因此,

13

Analysis of Keil C51 Switch Sentence Object Code

Hou Jigong
(Linewell Software Company Limited,Quanzhou 362000,China)

Keil C51is currently the most popular embedded programming language,this paper analyzes the compiling method and effect of its"switch"sentence.In general,the branches number of the"switch-case"sentence is less than 8,the object codes are divided into three layers,that are the head code,the transfer control code and the switch body.When the branches number of the more complex"switchcase"sentence is more than 8,the target codes are divided into four layers,which are the head code,the transfer control code,the transfer sheet and the switch body.Considering the code execution efficiency,the transfer control code of the system library function is different corresponding to different data types of the selected factor.

embedded system;C51language;assembler;compiler

TP393

A

2013年福建省科技重大专项专题项目2013HZ0004-1。

猜你喜欢
简式值域分支
一类离散时间反馈控制系统Hopf分支研究
函数的值域与最值
函数的值域与最值
巧分支与枝
值域求解——一个“少”字了得
破解函数值域的十招
Apparent diffusion coefficient by diffusion-weighted magnetic resonance imaging as a sole biomarker for staging and prognosis of gastric cancer
韦氏成人智力量表简式测验在脑外伤鉴定中的效度分析
有机合成题中信息迁移题的解题方法
羟基羧酸的多角度思维训练教学