汇编实现二进制的除法运算算法
发布时间:2011-10-11 16:43:20
发布时间:2011-10-11 16:43:20
汇编实现多字节二进制除法运算算法
2011-08-17 20:02:25| 分类: 嵌入式 | 标签: |字号大中小 订阅
二进制的除法通过重复减法运算实现即通过重复”从被除数的高位依次取出每一位, 被取出的数据加上上次的减法结果, 然后减去除数”的处理, 求出除法结果
假设:被除数 R0R1 (占用4字节)除数 R2R3 (占用4字节)商 R0R1 (占用4字节) ******************* 这里需要说明, 此程序执行结束以后, 商的结果保存在被除数中 ************余数 R4R5 (占用4字节)移位次数 R6L (占用1字节) ******************* 这里需要说明, 其数值根据被除数的位数定义, 这里为32 *************操作流程如下:a) 余数清零b) 判断除数是否为0, 如果为0, 是错误, 不再往下执行.c) 设定移位次数d) 被除数左移1位, 溢出的最高位保存在进位标志C中, 再把余数左移1位, 把C(被除数溢出的最高位)放入余数的最低位e) 余数与除数比较大小(余数减去除数): 余数 ≧ 除数(减法结果为正)时, 被除数的最低位, 赋值 1 余数 < 除数(减法结果为负时, 恢复到减法前的余数) 被除数的最低位, 赋值 0 f) 定移位次数递减g) 直到移位次数为0,否则重复d) ~ f)
程序代码以renesas为例
MOV.W #0,R4 ;clear R4MOV.W #0,R5 ;clear R5CMP.W R4,R2BNE LBL1 ;R4,R2 不相等, 程序跳至LBL1CMP.W R4,R3BEQ ERR ; R4,R3 相等, 程序跳至ERRLBL1:MOV.B #32,R6L ;set byte counterLBL2:SHLL R1L ;被除数左移1位, 最高位放入CROTXL R1HROTXL R2HROTXL R1HROTXL R5L ;余数左移1位, 移入CROTXL R5HROTXL R4HROTXL R4HBSET #0,R1L ; 被除数的最低位, 赋值 1
SUB.W R3,R5 ;余数 减去 除数SUBX.B R2L,R4LSUBX.B R2H,R4HBCC LBL3 ; 余数 ≧ 除数(减法结果为正) , 程序跳至LBL3ADD.W R3,R5 ; 余数 < 除数(减法结果为负时, 恢复到减法前的余数)ADDX.B R2L,R4LADDX.B R2H,R4HBCLR #0,R1L ; 被除数的最低位, 赋值 0LBL3:DEC.B R6L ; 定移位次数递减BNE LBL2 ; 移位次数为不0, 程序跳至LBL2BRA EXIT ; 程序跳至EXITERR: ; 添加除数为0 的处理EXIT:RTS