Keil C51的一些有趣特性
SH ACC PUSH B PUSH DPH PUSH DPL PUSH PSW USING 1 MOV PSW,#08H ; SOURCE LINE # 25 ; { ; TR0 = 0; ; SOURCE LINE # 27 CLR TR0 ; TH0 = 100; ; SOURCE LINE # 28 MOV TH0,#064H ; TL0 = 100; ; SOURCE LINE # 29 MOV TL0,#064H ; TR0 = 1; ; SOURCE LINE # 30 SETB TR0 ; ; OSTimeDly(5); ; SOURCE LINE # 32 MOV R7,#05H LCALL _OSTimeDly ; } ; SOURCE LINE # 33 POP PSW POP DPL POP DPH POP B POP ACC RETI ; END OF Timer0OVInt ; ; void OSTimeDly(unsigned char i) // using 0 RSEG ?PR?_OSTimeDly?TEST _OSTimeDly: USING 0 ; SOURCE LINE # 35 ;---- Variable 'i?441' assigned to Register 'R7' ---- ; { ; SOURCE LINE # 36 ?C0009: ; while(i--); ; SOURCE LINE # 37 MOV R6,AR7 DEC R7 MOV A,R6 JNZ ?C0009 ; } ; SOURCE LINE # 38 ?C0011: RET ; END OF _OSTimeDly 注意OSTimeDly()中此处的汇编代码, MOV R6,AR7 DEC R7 因为Timer0OVInt()函数使用的寄存器组是1 (using 1),而OSTimeDly()默认使用0寄存器组(默认使用的寄存器组是不会用代码显示改变的)。因此Timer0OVInt()调用OSTimeDly()时寄存器组仍然是1组,R7的地址是15,而AR7的地址为OSTimeDly()所使用的寄存器组中R7的地址,在0寄存器组中为7。因此当AR7为0时,这是一个死循环。 结论,使用不同寄存器组的函数(特殊情况外)不能相互调用
- Proteus软件仿真与Keil的单片机系统设计(09-08)
- 基于AT89C51单片机的量程自切换频率计(01-25)
- ARM菜鸟:JLINK与JTAG的区别(03-01)
- 基于单片机的可测温式电子万年历(03-02)
- Matlab/RTW实时仿真与嵌入式系统开发(02-03)
- 基于IAP和Keil MDK的远程升级设计(12-19)