探究下i--和--i在keil下编译c与汇编的区别
下面是c编写
#include<reg51.h>
void delay1(char i)
{ while(i--);
}
void delay2(char j)
{ while(j--);
}
void main()
{
while(1)
{
P1=0;
delay1(1);
P1=1;
delay2(2);
}
}
下面是汇编后程序
C:0x0000 020015 LJMP C:0015
8: void main()
9: {
10: while(1)
11: {
12: P1=0;
C:0x0003 E4 CLR A
C:0x0004 F590 MOV P1(0x90),A
13: delay1(1);
C:0x0006 7F01 MOV R7,#0x01
C:0x0008 120021 LCALL delay1(C:0021)
14: P1=1;
C:0x000B 759001 MOV P1(0x90),#0x01
15: delay2(2);
C:0x000E 7F02 MOV R7,#0x02
C:0x0010 120028 LCALL delay2(C:0028)
16: }
C:0x0013 80EE SJMP main(C:0003)
C:0x0015 787F MOV R0,#0x7F
C:0x0017 E4 CLR A
C:0x0018 F6 MOV @R0,A
C:0x0019 D8FD DJNZ R0,C:0018
C:0x001B 758107 MOV SP(0x81),#0x07
C:0x001E 020003 LJMP main(C:0003)
2: void delay1(char i)
3: { while(i--);
C:0x0021 AE07 MOV R6,0x07
C:0x0023 1F DEC R7
C:0x0024 EE MOV A,R6
C:0x0025 70FA JNZ delay1(C:0021)
4: }
C:0x0027 22 RET
5: void delay2(char j)
6: { while(--j);
C:0x0028 DFFE DJNZ R7,delay2(C:0028)
7: }
C:0x002A 22 RET
i是放在ax寄存器,如果是i++就是先把内容取出来,放在寄存器,然后再增加;而++i则是先增加再写入ax寄存器,送显示是送ax寄存器的内容。