c语言 proteus 延迟2秒_几种延时的汇编执行代码对比与总结

本文对C语言在51单片机中实现延迟的几种方法进行了测试和分析,包括单独定义变量的for语句、不定义变量的for语句以及改变循环结束条件的for语句。通过代码执行对比,得出实际延时与指令周期的关系,并指出不同写法的代码差异。
摘要由CSDN通过智能技术生成

拜读了网上《51单片机 Keil C 延时程序的简单研究 》(by: InfiniteSpace Studio/isjfk, 1.21.2004 )一文,借鉴了文中的方法,测试发现有一点点出入,原文作者在计算延时时间的时候是否忘了加上RET指令……下面介绍我的测试结果,欢迎交流探讨——

一、单独定义变量,for语句

28: delay1(1);

C:0x0005 7F01 MOV R7,#0x01

C:0x0007 1121 ACALL delay1(C:0021)

12: void delay1(unsigned char k)

13: {

17: unsigned char i=0;

C:0x0021 E4 CLR A

C:0x0022 FE MOV R6,A

18: for(i=0;i0;i--);相同

C:0x0023 EE MOV A,R6

C:0x0024 C3 CLR C

C:0x0025 9F SUBB A,R7

C:0x0026 5003 JNC C:002B

C:0x0028 0E INC R6

C:0x0029 80F8 SJMP C:0023

19: }

C:0x002B 22 RET

分析:

delay1(1); 410-390=20

delay1(2); 439-411=28

delay1(3); 476-440=36

即:指令周期(即实际延时)= 12 + 延时参数 * 8

二、不再重新定义变量,for语句

28: delay1(1);

C:0x0005 7F01 MOV R7,#0x01

C:0x0007 1123 ACALL delay1(C:0023)

12: void delay1(unsigned char k)

13: {

18: for(;k>0;k--);

C:0x0023 EF MOV A,R7

C:0x0024 D3 SETB C

C:0x0025 9400 SUBB A,#0x00

C:0x0027 4003 JC C:002C

C:0x0029 1F DEC R7

C:0x002A 80F7 SJMP delay1(C:0023)

19: }

C:0x002C 22 RET

分析:

delay1(1); 491-473=18

delay1(2); 518-492=26

指令周期(即实际延时)= 10 + 延时参数 * 8

对比一和二可知,延时函数中有重新定义循环变量i时,理所当然地多了2行代码

不知原文中 “其生成的代码是一样的。”的结论是如何得来的?

三、for语句,改变循环结束条件

23: delay1(1);

C:0x0005 7F01 MOV R7,#0x01

C:0x0007 1123 ACALL delay1(C:0023)

11: void delay1(unsigned char i)

12: {

13: // while(--i);

14: // while(i--);

15: for(; i != 0; i--);

C:0x0023 EF MOV A,R7

C:0x0024 6003 JZ C:0029

C:0x0026 1F DEC R7

C:0x0027 80FA SJMP delay1(C:0023)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值