📄 关于while(--n)三重循环.txt
字号:
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
File: 关于while(--n)的优化设计 〓
Time: 10:02 〓
Date: 08-7-29 〓
Note: MOV Direct,#Data 为两个机器周期 〓
MOV Rn,Direct 为两个机器周期 〓
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
◆实验目的:
用while实现三层循环,以达到更长的延迟时间.
◆测试代码:
void delay(unsigned char x, unsigned char y, unsigned char z)
{
unsigned char tempx,tempy,tempz=z;
do{tempy=y;do{tempx=x;while(--tempx);}while(--tempy);}while(--tempz);
}
◆汇编代码:
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION _delay (BEGIN)
;---- Variable 'x' assigned to Register 'R7' ----
;---- Variable 'z' assigned to Register 'R3' ----
;---- Variable 'y' assigned to Register 'R5' ----
;---- Variable 'tempz' assigned to Register 'R3' ----
0000 ?C0003:
;---- Variable 'tempy' assigned to Register 'R6' ----
0000 AE05 MOV R6,AR5(y) 2'
0002 ?C0006:
;---- Variable 'tempx' assigned to Register 'R4' ----
0002 AC07 MOV R4,AR7(x) 2'
0004 ?C0007:
0004 DCFE DJNZ R4,?C0007 2'
0006 ?C0004:
0006 DEFA DJNZ R6,?C0006 2'
0008 DBF6 DJNZ R3,?C0003 2'
000A 22 RET 2'
; FUNCTION _delay (END)
; FUNCTION main (BEGIN)
0000 E4 CLR A 1'
0001 F580 MOV P0,A 1'
0003 7B01 MOV R3,#01H 1'
0005 7D47 MOV R5,#047H 1'
0007 7F05 MOV R7,#05H 1'
0009 120000 R LCALL _delay 2'
000C 7580FF MOV P0,#0FFH 2'
000F 22 RET 2'
; FUNCTION main (END)
◆实验记录:
x=5,y=71,z=1
0.000 389 00
0.001 396 00 0.001 007 00
◆推论公式:
[(2*x+2)*y+2*y+2]*z+2*z+2+5+2=0.001 007 00
◆结论验证:
x=10,y=60,z=5
0.000 389 00
0.007 618 00 0.007 229 00
[(2*x+2)*y+2*y+2]*z+2*z+2+5+2=0.007 229 00 OK!测试通过
◆实验结论:
延迟时间为:Delay_Time=[(2*x+2)*y+2*y+2]*z+2*z+2+5+2
=[(2*x+2)*y+2*y+2]*z+2*z+7
=2*x*y*z+4*y*z+4*z+7
即:【Delay_Time=2xyz+4yz+4z+7】
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -