微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Keil C51的一些有趣特性

Keil C51的一些有趣特性

时间:05-14 来源:互联网 点击:

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时,这是一个死循环。

结论,使用不同寄存器组的函数(特殊情况外)不能相互调用

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top