当前位置: 网站首页 > 技术应用 > 单片机应用 > 汇编运算

双字节除以双字节的子程序

一种 SN 双字节除以双字节的子程序
SN 双字节除以双字节的子程序: ------ 双字节/双字节*扩展系数N
此方法与小学生做除法的思路相同!:不变动除数!
M6,M7:系数N,为了避免小数点,
例如:  20/30 肯定出来全部小数位!一个整数都没有!
如果,20*10/30 则不会出来小数位(不包括除不尽的数了)!
也可以说扩大多少倍再来运算的意思!商被扩大了多少倍!就有办法得到明明是小数位的整数!
M2,M3/M4,M5 :被除数与除数.
方法:
使用被除数-除数,如果够减,就+上商,这个商就是系数N!而不是实际的商!
预先估计计算的小数位有多少位,以便决定系数N也扩大多少位,----就是说:把 0.1 变成 1 或变成 10 都是这样决定的!
这个程序大量使用了宏指令,程序简洁,但是注释非常清楚!
运算中没有变动除数,而是每逢不够减就加大被除数同时减少系数.这样比较保证精度!
如果不够减就减少除数和系数,也是可以的,但是运算精度下降!
这种方法运算速度比移位法快得多!
例如:
2000-1800 ,够减, +1000 .得数一下子就是 1000 !移位需要很多次呢!
这是经常使用的,不存在任何问题!
按照这个道理. 3 字节以上都是很容易做的!没有字节的限制!
该子程序全部如下可以被主程序或其它程序调用)
;===========================================================
Z_2MC2M: ;求实际数据:  M2,M3/M4,M5*N
        Z2M0        EEH,EEL ;结果,使用之前都=0!
        ZM0        R       ;临时寄存器,使用之前都=0!
Z_C2M:
        M2MS0        M2,M3,Z_C2M1 ;高低字节同时为 0 退出
        RET
Z_C2M1:
        M2MS0        M4,M5,Z_C2M2 ;高低字节同时为 0 退出
        RET
Z_C2M2:
        M2MS0        M6,M7,Z_C2M3 ;高低字节同时为 0 退出
        RET
Z_C2M3:
        SBC2Z        M2,M3,M4,M5  ;被除数-除数
        MOV        A,R          ;扩展一个临时字节,为了下一步的运算
        SUBC        A,#0
        MOV        R,A
        CS1        FC           ;判断FC=1?
        JMP        Z_C2M0       ;不够减
        ADC2Z        EEH,EEL,M6,M7 ;加上商(系数).
        JMP        Z_C2M         ;返回再次计算
Z_C2M0:
        ADC2Z        M2,M3,M4,M5   ;把除数加回到被除数
        MOV        A,#0
        ADDC        R,A

        RRC2M        M6,M7      ;系数/2
        RLC2M        M2,M3      ;被除数*2,可能会溢出,因此增加一个临时寄存器 R
        RLCM        R
        JMP        Z_C2M      ;返回再次计算
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

点击次数:  【关闭
  • 壹零零单片机©版权所有 2008-2025 粤ICP备17151077号

Powered by  xinfuke  5.2.5 ©2008-2025  www.100mcu.com