应广单片机16位除8位除法函数仿真实验

应广单片机的16除8位仿真实验

主要是想让大家了解运算的计算以及仿真的过程。

主体程序

由于没有乘法/的功能,只能有函数的方法计数除法。
缺点:占用数据变量位过多,有的单片机数据空间只有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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值