赞
踩
主要是想让大家了解运算的计算以及仿真的过程。
由于没有乘法/的功能,只能有函数的方法计数除法。
缺点:占用数据变量位过多,有的单片机数据空间只有64字节,要抠抠搜搜空间。
程序表达的是16位18730除以8位54的函数计算过程,函数计算过程会把计算结果放在div_src2
直接运行到循环开始图标点1,标点2是此时的变量表。
然后一直执行到
由于刚开始18730的二进制为0100100100101010,左移一位变成1001001001010100没有产生进位,前面的没有什么变化。div_cnt计数+1。
然后执行 到A = div_res - div_val;
变量变成
可以看到div_val和 div_res都是无符号8位,所以0-54=256-54=202,所以A为202。同时,产生了借位,CF为1,所以并不给进入下面的if。
接下来是第二次循环
此时div_src2 <<= 1;左移产生进位,变成0010010010101000,并CF为1
执行slc div_res;为
可以看到,如代码注释的操作。
继续执行,因为有A = div_res - div_val;在,所以要进入if语句,必须要div_res大于等于除数div_val=54,这样CF才为0,才能进入if语句。
所以是第二次循环也没有能进入if语句。
第三次循环!
div_src2左移没有产生进位,slc div_res;的结果是0000 0001变成0000 0010,每次左移有CF为1,则0位为1,否则左移后0位为0。
接下来省略。。。
一直到第8次循环
此时div_src2为38144=1001 0101 0000 0000
div_res为36=0010 0100
div_src2左移产生进位div_src2=0010 1010 0000 0000,CF为1
div_res变成0100 1001
产生div_res大于除数54,
执行 A = div_res - div_val;则
可以看到73-54=19,可以减完,没有产生借位,CF为0,就可以进入if,
执行if,div_src2变成0010 1010 0000 0001,余数div_res变成19.
第9次循环
div_src2变成0101 0100 0000 0010
div_res变成00100110
一直循环16次,相当于把16位被除数的每一位左移,把商的结果放在0位,直到16次移位,到他们对应的位置。
简单来说就是,利用移位,相当于平常的除法,18730的1能不能除54,不能。18能不能除54,不能。187可不可以除54,可以,区别在于,通过位移是相当于乘2,相当于18730=0100 1001 0010 1010,有1能不能除54。10能不能。100能不能,1001能不能,10010能不能,这样子的,直到大于等于54,则令div_src2的0位为1,随着循环到相应的位数去。
A = div_res - div_val;的作用是当余数div_res大于等于div_val除数54时,不产生借位,就会进入if,if里面就是商0位给1,并随着循环左移,最后除法完成。
可能讲的不好,有什么不明白的问我就OK
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。