多字节二进制除法算法2009-3-278:17:00 二进制的除法本质是通过重复减法运算实现 即通过重复”从被除数的高位依次取出每一位,被取出的数据加上上次的减法结果*2, 然后减去除数”的处理, 求出除法结果 假设:16位除以16位
假设32位除以16位 被除数R3R2R1R0 除数R5R4 余数R7R6 商也在R3R2R1R0中 计算开始的时候R7R6R3R2R1R0整体左移一位 然后余数R7R6与除数比较 如果大于除数 则r0最低位置一 依次循环32次 其他的多位除法类似但是余数位数和除数位数要一致 ; (r3r2r1r0) / (r5r4),余数(r7r6) div_4b: mov r7,#0
rlc a
|
应邀写个汇编语言的除法子程序。 编写除法子程序,有两种算法,移位相减的方法和循环相减的方法。 移位相减的方法是仿照人们做除法的竖式编写,执行速度较快,但是计算的原理,一般人不好理解,难以让大家推广到更多的字节。故此下面采用循环相减的思路来编写程序。 设计思路:所谓除法,就是要求出在被除数中,含有多少个除数。那么就用被除数连续的减去除数,直到不够减为止,够减的次数,就是商,不够减的数值,就是余数。 比如:8/3,就是 第1次:8-3=5 第2次:5-3=2 2不够减3了,故8/3=2余2 下列程序,对数值范围的要求很宽松,被除数、除数和商,都可以是16位数,这比网上常见的16位除8位的除法程序,适用面要广得多。 注意,除数为0的问题,应该在主程序中进行检测。 ;------------------------------------- ;16位/16位的子程序 ;被除数:R2R3、除数:R4R5;商:DPTR、余数:R2R3。 ;占用:A、B。 ;------------------------------------- R23DIVR45: MOV DPTR, #0 D_LOOP: CLR C MOV A, R3 SUBB A,R5 MOV B, A MOV A, R2 SUBB A,R4;R2R3-R4R5 JC DIV_E;有借位转移 INC DPTR MOV R3, B MOV R2, A SJMPD_LOOP DIV_E: RET;不够减就结束 ;------------------------------------- ;完 |