以下延时子程序:
void delay(uchar i,uchar j) (注意i,j的类型,类型不一样,keil编译后的代码也不一样)
{
while(i--)
while(j--);
}
void main()
{
delay(2,3);
}
经keil编译后的代码为:
---- Variable 'i' assigned to Register 'R7' ----
---- Variable 'j' assigned to Register 'R5' ----
?C0001: MOV R6,AR7 (2个机器周期) (AR7由KEIL定义,属于第0个工作寄存器组R7寄存器的直接(direct)地址访问)
DEC R7 (1个机器周期)
MOV A,R6 (1个机器周期)
JZ ?C0005 (2个机器周期)
?C0003: MOV R6,AR5 (2个机器周期)
DEC R5 (1个机器周期)
MOV A,R6 (1个机器周期)
JZ ?C0001 (2个机器周期)
SJMP ?C0003 (2个机器周期)
?C0005: RET (2个机器周期)
经计算可知延时为: 2+[i*(j*8+6)+6]+2 即 i*(j*8+6)+10
其中,第一个2为 LCALL 的周期,第二个2为 RET 的周期。
本内容试读结束,登录后可阅读更多
下载后可阅读完整内容,剩余1页未读,立即下载