延时在单任务系统中一般是通过做无用的操作来浪费这段时间,
也就是这个时间瞎执行一些没用的指令, 过了定时值后, 立刻执行所要求的代码.
延时就是做数学题, 如题可知
1) 8086 时钟周期 5MHz
可知, CPU执行一个周期是1/5000000= 0.2 微秒
2) 需要延时 1毫秒
即, 需要浪费x个周期, 0.2 * x = 1000 (1毫秒=1000微秒)
x = 5000.
3) 一个Nop(什么都不做指令)是3c (3个周期)
5000/3 = 1333
程序中写1333个NOP显然要累死你
于是一个聪明的办法就是写个什么也不做,
专门浪费时间的循环, 于是就有了题目中的样子
1次循环共多少指令周期呢? 加一下
mov 4个 [这个是循环之前的初始化, 浪费了4个周期]
---------------
nop 3个
nop 3个
loop 9个 (只有循环结束才不转移)
----------------
可知: 3+3+9 = 15
(5000-4) / 15 = 333
事实上这个延时并不是非常非常的精确,
因为5000除不尽15, 而且最后的loop是5个周期也不是9个
精确到2个微秒级, 这是后话