0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

介绍一种即省时又节约资源的乘除法算法

0BFC_eet_china 来源:未知 作者:李倩 2018-05-31 08:51 次阅读

目前单片机的市场竞争很激烈,许多应用出于性价比的考虑,选择使用程序存储空间较小(如1K,2K)的小资源8位MCU芯片进行开发。一般情况下,这类MCU没有硬件乘法、除法指令,在程序必须使用乘除法运算时,如果单纯依靠编译器调用内部函数库来实现,常常会有代码量偏大、执行效率偏低的缺点。

上海晟矽微电子推出的MC30、MC32系列MCU,采用了RISC架构,在小资源8位MCU领域有广大的用户群和广泛的应用,本文就以晟矽微电的这两个系列产品的指令集为例,结合汇编与C编译平台,给大家介绍一种即省时又节约资源的乘除法算法

乘法篇

单片机中的乘法是二进制的乘法,也就是把乘数的各个位与被乘数相乘,然后再相加得出,因为乘数和被乘数都是二进制,所以实际编程时每一步的乘法可以用移位实现。

例如:乘数R3=01101101,被乘数R4=11000101,乘积R1R0。步骤如下

1、清空乘积R1R0;

2、乘数的第0位是1,那被乘数R4需要乘上二进制数1,也就是左移0位,加到R1R0里;

3、乘数的第1位是0,忽略;

4、乘数的第2位是1,那被乘数R4需要乘上二进制数100,也就是左移2位,加到R1R0里;

5、乘数的第3位是1,那被乘数R4需要乘上二进制数1000,也就是左移3位,加到R1R0里;

6、乘数的第4位是0,忽略;

7、乘数的第5位是1,那被乘数R4需要乘上二进制数100000,也就是左移5位,加到R1R0里;

8、乘数的第6位是1,那被乘数R4需要乘上二进制数1000000,也就是左移6位,加到R1R0里;

9、乘数的第7位是0,忽略;

10、这时候R1R0里的值就是最后的乘积,至此算法完成。

以上例子运算结果:

R1R0 = R3 * R4= (R4<<6)+(R4<<5)+(R4<<3)+(R4<<2)+R4 = 101001111100001

实际运算流程图见图1.1。

图1.1 汇编乘法运算流程图

在实际的程序设计过程中,程序优化有两个目标,提高程序运行效率,和减少代码量。我们来看下本文提供的汇编算法和普通C语言编程的效率和代码量对比。

表1.1是程序运行效率的对比数据(可能会有小的偏差),很明显汇编编译出来的运行时间要比C语言减少很多。

汇编(时钟周期) C语言(时钟周期)
8*8位乘法 79-87 184-190
16*8位乘法 201-210 362-388
16*16位乘法 234-379 396-468

表1.1 乘法运算时钟周期对比表

表1.2是程序代码量的对比数据(可能会有小的偏差),汇编占用的程序空间也要比C语言小很多。

汇编(Byte C语言(Byte)
8*8位乘法 15 34
16*8位乘法 19 96
16*16位乘法 31 96

表1.2 乘法运算ROM空间使用情况对比表

综上两点,本文介绍的乘法算法各方面使用情况都要比C编译好很多。如果大家在使用过程中,原有的程序不能满足应用需求,例如遇到程序空间不够或者运行时间太久等问题,都可以按照以上方式进行优化。汇编语言最接近机器语言的。在汇编语言中可以直接操作寄存器,调整指令执行顺序。由于汇编语言直接面对硬件平台,而不同的硬件平台的指令集及指令周期均有较大差异,这样会对程序的移植和维护造成一定的不便,所以我们针对精简指令集做了乘法运算的例程,便于大家的移植和理解。

除法篇

单片机中的除法也是二进制的除法,和现实中数学的除法类似,是从被除数的高位开始,按位对除数进行相处取余的运算,得出的余数再和之后的被除数一起再进行新的相除取余的运算,直到除不尽为止,因为单片机中的除法是二进制的,每个步骤除出来的商最大只有1,所以我们实际编程时可以把每一步的除法看作减法运算。

例如:被除数R3R4=1100110001101101,除数R5=11000101,商R1R0,余数R2。步骤如下

1、清空商R1R0,余数R2;

2、被除数放开最高位,第15位,为1,1比除数小,商为0,余数R2为1;

3、上一步余数并上被除数次高位,第14位,得11,11仍然比除数小,商为0,余数R2为11

4、直到放开第8位后,得11001100,比除数大,商得1,余数R2为111;

5、上一步余数并上被除数第7位,得1110,没有除数大,商为0,余数R2为1110;

6、上一步余数并上被除数第6位,得11101,没有除数大,商为0,余数R2为11101;

7、按照以上步骤,直到放开了被除数得第3位,得11101101,比除数大,商为1,余数R2为101000;

8、上一步余数并上被除数第2位,得1010001,没有除数大,商为0,余数R2为1010001;

9、上一步余数并上被除数第1位,得10100010,没有除数大,商为0,余数R2为10100010;

10、上一步余数并上被除数第0位,得101000101,比除数大,商为1,余数R2为10000000;

11、然后把以上所有步骤中得商从左至右依次排列就是最后的商100001001,余数为最后算得的余数10000000。

以上例子运算结果 R1R0 = R3R4 / R5 = 100001001

R2 = R3R4 % R5 = 10000000

实际运算流程图见图2.1。

图2.1 汇编除法运算流程图

除法运算的效率,代码量见以下表格

表1.1是程序运行效率和代码量的对比数据(可能会有小的偏差),很明显本文提供的汇编算法要优化的很多。

16/8位除法 汇编 C语言
时钟周期 287-321 740-804
使用空间(Byte) 35 142

表2.1 除法运算时钟周期对比表

所以对于除法运算,本文提供的方法也是相对较优的。

以下是针对精简指令集做的除法运算,16/8位的例程,便于大家的移植和理解。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    5998

    文章

    43948

    浏览量

    620561
  • mcu
    mcu
    +关注

    关注

    145

    文章

    15989

    浏览量

    343342
  • 编程
    +关注

    关注

    88

    文章

    3438

    浏览量

    92322

原文标题:针对小容量单片机程序优化方式--乘除法篇

文章出处:【微信号:eet-china,微信公众号:电子工程专辑】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    乘除法运算

    乘除法运算本应用例的目的在于提供乘、除运算的函数及介绍乘除运算在SPMC75F2413A中的使用。应用例提供有符号和无符号数的乘除,其中包括32-Bit/16-Bit、16-Bit/8
    发表于 09-21 09:26

    雾盈FPGA笔记之(三十二)六位四则运算计算器(8)算法实现加减乘除

    用“+,-,*,/”这几个符号,这样写起来很简便,看起来也很简洁,但是不好的是,综合出乘法器和除法器,FPGA需要消耗很多的硬件资源,这样的设计当然应该尽可能避免的。所以,我给大家介绍用小小的
    发表于 09-01 09:03

    FFT 算法一种 FPGA 实现

    本帖最后由 lee_st 于 2017-11-22 08:28 编辑 摘 要: FFT 运算在OFDM 系统中起调制和解调的作用。针对OFDM 系统中FFT 运算的要求, 研究了一种易于
    发表于 11-21 15:55

    51单片机寻址方式的疑问:为什么B寄存器在乘除法指令中是寄存器寻址?

    51单片机中B寄存器是SFR,B寄存器仅在乘法、除法指令中为寄存器寻址,在其它指令中为直接寻址。那么它只有在乘除法时看做特殊功能寄存器,其他指令看做通用寄存器。但是直接寻址是访问特殊功能寄存器的唯方式,为什么B寄存器在
    发表于 01-01 09:45

    介绍一种防止相位假信号的具体算法

    什么是S参数测量?S参数插补算法是什么?介绍一种防止级联的S参数出现相位假信号的具体算法
    发表于 04-30 07:00

    介绍一种基于小波域的分形图像编码改进算法

    本文介绍一种基于小波域的分形图像编码改进算法
    发表于 06-03 07:28

    整数乘除法与位运算的效率对比分析哪个好

    - 例程2,ADC滤波算法04 - 总结1us的误差,足矣改变这个世界 ————CSDN根号301 - 为什么整数位移比乘除法高效  首先,整数位运算要比乘除法要高效。如果学过计算机组成...
    发表于 12-24 07:33

    RISC有没有乘除法指令呢?

    RISC有没有乘除法指令呢?
    发表于 02-27 13:59

    乘除法和开方运算的FPGA串行实现

    高精度的乘除法和开方等数学运算在FPGA实现中往往要消耗大量专用乘法器和逻辑资源。在资源敏感而计算时延要求较低的应用中,以处理时间换取资源的串行运算方法具有广泛的应
    发表于 07-28 18:05 37次下载

    乘除法电路

    乘除法电路 图5.4-21是乘除法运算实用电路之一。 1、A
    发表于 04-26 16:11 1.6w次阅读
    <b class='flag-5'>乘除法</b>电路

    单片机浮点数的快速除法

    介绍一种在 8096 /96 系列单片机上实现的单精度 浮点数 快速除法。该算法采用了预估一修正的数值计算方法,并充分利用了16 位CPU 中的乘除
    发表于 06-03 16:47 93次下载
    单片机浮点数的快速<b class='flag-5'>除法</b>

    基于delta码的乘除法运算错误检测改进算法

    为确保安全苛求系统中程序执行的正确性,研究人员将差错控制理论用于对计算机指令进行编码,但由于编码大多涉及模运算,导致复杂度大量增加,应用于实时系统有困难。针对复杂度问题对delta码的乘除法运算算法
    发表于 12-04 16:44 0次下载

    基于StratixⅡEP2S30484C5芯片的乘除法和开方运算算法的实现

    高、资源敏感而计算时延要求并不高,这时我们需要一种保证计算正确且资源开销最低的FPGA实现方法,本文给出了实现乘除法、开方运算的FPGA串行实现算法
    发表于 07-29 17:48 1173次阅读
    基于StratixⅡEP2S30484C5芯片的<b class='flag-5'>乘除法</b>和开方运算<b class='flag-5'>算法</b>的实现

    C语言如何用移位来解决乘除法问题

    用移位来解决乘除法问题 a =a* 4 ; b =b/ 4 ; 可以改为: a =a 2 ; b =b >> 2 ; 通常如果需要乘以或除以2的n次方,都可以用移位的方法代替。用移位的方法得到代码
    的头像 发表于 11-21 11:25 455次阅读

    一种使用fifo节约资源降低功耗的设计方法

    本案例中,我们讲解一种使用fifo节约资源,降低功耗的设计。
    的头像 发表于 12-15 16:34 256次阅读
    <b class='flag-5'>一种</b>使用fifo<b class='flag-5'>节约</b><b class='flag-5'>资源</b>降低功耗的设计方法