void delay(unsigned int n)
{
while(n--);
}
void main()
{
delay(10);
}
delay(10)是延时多长时间的?在晶振是12M的情况下
我用KEIL 查,转成的汇编如下:
main 函数
C:0x0020 7F03 MOV R7,#0x03
C:0x0022 7E00 MOV R6,#0x00
C:0x0024 020003 LJMP delay(C:0003)
C:0x0027 00 NOP
C:0x0028 00 NOP
3: void delay(unsigned int n)
4: {
5: while(n--);
C:0x000F EF MOV A,R7
C:0x0010 1F DEC R7
C:0x0011 AC06 MOV R4,0x06
C:0x0013 7001 JNZ C:0016
C:0x0015 1E DEC R6
C:0x0016 4C ORL A,R4
C:0x0017 70F6 JNZ delay(C:000F)
6: }
7:
C:0x0019 22 RET
从上述汇编中可以看到,n每次执行一遍,需要大概4条单周期指令+2条双周期指令,也就没每次延时 8μ秒
所以10次的话,那就是 8*10 + 4 + 2
其中4为函数参数入栈和跳转,2位函数返回。
问题
1)不知道这样理解对不对?
2)另外,不知道KEIL生产hex的时候,会不会对汇编再进行优化?
2)C:0x0011 AC06 MOV R4,0x06 没看明白这条汇编有什么用,为什么将0x06放入R4,为什么是0x06,为什么是R4?
C:0x0016 4C ORL A,R4. 这条也不明白,直接判断A是否为0不就得了,为什么还要与R4或呢?
|