DELAYLOOP: 是行号,
这句:
DJNZ R7,DELAYLOOP
就是说 R7减一后要是不为0 就跳到DELAYLOOP: 执行。
DELAY: 是子函数入口。
ACALL DELAY 这句调用子函数DELAY,也就是从DELAY: 执行
执行到RET 后返回,执行下一句ACALL DELAY 也就是DJNZ R2,OUTPUT
这个子函数是延时用的。
。
这个代码其实还是很清楚明了的。
DELY1: PUSH AX ;延时子程序,这里PUSH AX 其实可以不要的,因为AX没有做任何改动
PUSH CX ; 因为使用了CX来计数,所以先保存CX进堆栈
MOV CX,30H ; 循环30H也就是48次
DLY1: CALL DELY2 ; 在次调用一个延时子程序
LOOP DLY1 ; 循环,48次,不到次数则继续循环
POP CX ; 恢复被保护的原来CX的值
POP AX ; 恢复被保护的原来AX的值
RET ; 过程返回
DELY2: PUSH CX ; 内部调用的过程,也需要把CX当前的值保护进堆栈
MOV CX,8000H ; 循环8000H也就是32768次
LOOP $ ; $ 表示当前地址,也就是自己的地址,32768次循环不到则原地踏步
POP CX ; 恢复被保护的CX的值
RET ; 过程返回
1循环延时的方法
DELAY: ;误差 0us
MOV R7,#25H
DL1:
MOV R6,#9AH
DL0:
MOV R5,#02H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
RET
不过这不实用。40MS时间单片机都 在这里循环,不作能它事。
1可以用定时中断的方法:
ORG 0000H
LJMP START
ORG 000BH
LJMP Timer0Interrupt
START:
MOV SP,#60H
LCALL InitTimer0
LOOP:
;add your code here!
LJMP LOOP
InitTimer0:
MOV TMOD,#01H
MOV TH0,#63H
MOV TL0,#0C0H
SETB EA
SETB ET0
SETB TR0
RET
Timer0Interrupt:
PUSH DPH
PUSH DPL
PUSH ACC
MOV TH0,#63H
MOV TL0,#0C0H
;========================
;add your code here!
;========================
POP ACC
POP DPL
POP DPH
RETI
END
要求编写延时子程序,就不要使用定时器;
也不要用C语言,因为C语言的执行时间,并不确定。
用汇编语言,是最简单、准确的。
51单片机的程序如下:
DL1000:
MOV R7,#248
DJNZ R7,$
MOV R7,#250
DJNZ R7,$
RET
正好1000个机器周期。
R7,是8位寄存器,其最大数值是255,不能直接存入500。
LOOP $ 中$表示本指令的地址,相当于不停的循环执行这样的命令
cycle:
dec cx
jnz cycle
一般用来延时用。
str DB 21 这个是 str 的定义
是这样的:分支转移指令的指令(例如你程序中的LOOP和JNZ等等)的周期不是固定的一个数,而是与走哪个分支相关的,那个17
OR
5就是这个意思,以LOOP
WAIT为例,内循环中该指令共执行2801次,前2800次都会转移(17),最后一次是顺序向下执行(5),这就是2801x17-12的由来,当然也可以写成(2801-1)x17+5
另外,通常来说分支转移指令“转移”的分支周期数比“顺序”的分支要长,这是因为“转移”使得指令队列或者流水线中断了,需要重新填满。
现在CPU中的“分支预测”功能其实就是为了解决这个问题的,还以你的内循环为例,有“分支预测”时的执行时间就变成1x17+(2801-2)x5+1x17了,快了许多。
呵呵,你的理解几乎都是对的。
最后一次执行分支指令时,按预测要“跳转”,所以CPU就按跳转的顺序装入指令队列,可问题是这一次不该跳转,所以预测错了,所以事先装入的指令队列都要作废,这与没有“分支预测”时的“跳转”是一样的。也就是说,有“分支预测”时,是预测对5,预测错17。
没有“分支预测”功能“相当于”每次都“预测”不跳转,所以只有最后一次“预测”对了;而有“分支预测”功能时,预测结果和前一次执行该指令相同,所以对于循环来说,第1次会错(没有“前一次”,就按顺序预测),最后一次也会错(因为前一次跳转了而这一次不),中间的其它次都会预测正确。
明白了吗,关键不是“跳不跳转”,而是需不需要“重装”指令队列或流水线。
以上就是关于急求 单片机C51 汇编语言 LOOP: OUTPUT: DELAY: DELAYLOOP: 格是什么意思 我是初学者全部的内容,包括:急求 单片机C51 汇编语言 LOOP: OUTPUT: DELAY: DELAYLOOP: 格是什么意思 我是初学者、我想请教一下有关汇编语言延时子程序的问题下面的子程序有点看不懂,请大家帮忙解释一下,谢谢!、单片机中,怎么用汇编语言编写程序实现延迟40ms等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)