- 壹零零单片机©版权所有 2008-2025 粤ICP备17151077号
一种 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 ;返回再次计算
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&