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或呢?
|