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 
我们可以明显观察到初始化、比较、跳转、更新条件。