3,执行125*200=25000次。每次2个机器周期。4,执行200次,每次2个机器周期。5,最后执行一次返回,花费2个机器周期。如果是12MHZ的晶伏悄振,震荡周期1/12US,机器周期1US。
整个延时程序,花费50603个指令周期,乘以1us,大概延时50Ms左右。怎么会是机器周期*200呢?机器周期应该是振荡周期的12被才对。
push cx先把cx推进栈以保存cx原来简首的中咐改值。然后用mov cx,0ffh赋值,卖判loop循环每执行一次cx自减一,到cx为0为止,此时循环共执行0ffh次即255次。再将栈中cx原来的值d出给cx寄存器。
如果CUP主频为40mHz,则时钟周期为1/40=0.025微秒。
在808X中,一条LOOP指令如果实现跳转的话需要18个时钟周期,退出时需要5个时钟周期。所以这个延时子程序循环部分的延时(0.025*18*255+5)微秒,其他语句的延时基本可以忽略
这个代码其实还是很清楚明了的。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 过程返回
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)