for语句功能如此强大,为了建议不了解for语句的实现的原理。我们参考一下keil实现方法。通过观察keil的汇编结果来了解for. 为了观察for语句的框架,我们尽可能把程序写的简单。
#include
#include
int main( )
{
volatile char m=0;
volatile char n=0;
for(m=0;m<100;m++)
n=m;
return 0;
}
我们来看一下keil汇编结果
5: int main( )
6: {
7:
8: volatile char m=0;
C:0x0003 E4 CLR A
C:0x0004 F508 MOV 0x08,A
9: volatile char n=0;
10:
C:0x0006 F509 MOV 0x09,A
11: for(m=0;m<100;m+=2)
C:0x0008 F508 MOV 0x08,A
C:0x000A C3 CLR C
C:0x000B E508 MOV A,0x08
C:0x000D 6480 XRL A,#P0(0x80)
C:0x000F 94E4 SUBB A,#0xE4
C:0x0011 5009 JNC C:001C
12: n=m;
C:0x0013 850809 MOV 0x09,0x08
C:0x0016 0508 INC 0x08
C:0x0018 0508 INC 0x08
C:0x001A 80EE SJMP C:000A
13: return 0;
C:0x001C E4 CLR A
C:0x001D FE MOV R6,A
C:0x001E FF MOV R7,A
14: }
C:0x001F 22 RET
我们逐行来分析
我们来看一下keil汇编结果
5: int main( )
6: {
7:
8: volatile char m=0;
C:0x0003 E4 CLR A
C:0x0004 F508 MOV 0x08,A //0x08地址(m)存储内容清0
9: volatile char n=0;
10:
C:0x0006 F509 MOV 0x09,A //0x09地址(n)存储内容清0
11: for(m=0;m<100;m+=2)
C:0x0008 F508 MOV 0x08,A //0x08地址(m)存储内容清0
C:0x000A C3 CLR C //CY(借位)标志清零
C:0x000B E508 MOV A,0x08 //0x08地址(m)存储内容移入A寄存器
C:0x000D 6480 XRL A,#P0(0x80)//A^0x80结果存入A寄存器(最高位置1)
C:0x000F 94E4 SUBB A,#0xE4 //A寄存器值减去0xe4,结果移入A
C:0x0011 5009 JNC C:001C //是否借位,如果借位转至0x001C
12: n=m;
C:0x0013 850809 MOV 0x09,0x08//m值移入n
C:0x0016 0508 INC 0x08 //m++
C:0x0018 0508 INC 0x08 //m++
C:0x001A 80EE SJMP C:000A 转至0x000A
13: return 0;
C:0x001C E4 CLR A
C:0x001D FE MOV R6,A
C:0x001E FF MOV R7,A
14: }
C:0x001F 22 RET
我们可以明显观察到初始化、比较、跳转、更新条件。