文档介绍:C51 优化设计之循环语句(上) 使用 DJNZ 循环指令提高执行效率
C51 优化设计之循环语句(上) 使用 DJNZ 循环指令提高执行效率
[原创] 主题词:高效代码;循环语句 ;Keil C51;DJNZ
C51 有三种循环语句即 while,do-while 和 for, 这三种循环都可以用来处理同一问 题 ,基本上三者可以相互替换 .但由于 C51 是针对 51 汇编语言的编译器 ,如果不注 意 51 汇编指令的特点 , 不同的编程方式可能得到不同的程序性能 ( 执行速度和代 码长度 ).以计算 1+2+3+...+9+10 为例,下面做一对比 .
程序 1:
unsigned char i; unsigned char sum; for(i=1,sum=0;i<11;i++) {
sum+=i;
}
汇编代码为 :
C:0x0003
7F01
MOV
R7,#0x01
C:0x0005
E4
CLR
A
C:0x0006
FE
MOV
R6,A
C:0x0007
EF
MOV
A,R7
C:0x0008
2E
ADD
A,R6
C:0x0009
FE
MOV
R6,A
C:0x000A
0F
INC
R7
C:0x000B
BF0BF9 CJNE R7,#0x0B
,C:0007 代码长度 (字节):11,执行周期 (机器周期 ):63
程序 2:
unsigned char i; unsigned char sum; for(i=10,sum=0;i;i--) {
sum+=i;
} 汇编代码为 :
C:0x000F
7F0A
C:0x0011
E4
C:0x0012
FE
C:0x0013
EF
C:0x0014
2E
C:0x0015
FE
C:0x0016
DFFB
MOV
R7,#0x0A
CLR
A
MOV
R6,A
MOV
A,R7
ADD
A,R6
MOV
R6,A
DJNZ R7,C:0013
C51 优化设计之循环语句(上) 使用 DJNZ 循环指令提高执行效率
C51 优化设计之循环语句(上) 使用 DJNZ 循环指令提高执行效率
代码长度 (字节):9,执行周期 (机器周期 ):53
程序 3:
unsigned char i=11;
unsigned char sum=0; while(i--)
{
sum+=i;
} 汇编代码为 :
C:0x0003
7F0A
MOV
R7,#0x0B
C:0x0005
E4
CLR
A
C:0x0006
FE
MOV
R6,A
C:0x0007
AD07
MOV
R5,0x07
C:0x0009
1F
DEC
R7
C:0x000A
ED
MOV
A,R5
C:0x000B
6005
JZ
C:0012
C:0x000D
EF
MOV
A,R7
C:0x000E
2E
ADD
A,R6
C:0x000F
FE
MOV
R6,A
C:0x0010
80F5
SJMP
C:0007
代码长度