;(四字节除四字节,被除数或者除数小于四字节,则前面填0即可) ; 后面还有一个双字节除双字节的程序,如果除数是单字节,则字高位填为00即可) ;51单片机多字节的除法 ;R4R5R6R7放被除数 R0R1R2R3放除数 ;当除数的长度为4字节时 R3R4R5R6是余数 R7是商 ;当除数的长度为3字节时 R3R4R5是余数 R6R7是商 ;当除数的长度为2字节时 R3R4是余数 R5R6R7是商 ;当除数的长度为1字节时 R3是余数 R4R5R6R7是商 ;被除数是双字时,将R4R5置为0即可,这个程序包打天下 ;用一个单元来放中间值 单元名为danyuan danyuan equ 3BH MOV R7,#0ffh MOV R6,#0ffh MOV R5,#0ffh MOV R4,#0ffh MOV R3,#100 MOV R2,#0H MOV R1,#0H MOV R0,#0H MOV B,#08H CJNE R0,#00H,DVDL MOV B,#10H CLR A XCH A,R3 XCH A,R2 XCH A,R1 XCH A,R0 CJNE R0,#00H,DVDL CLR A XCH A,R2 XCH A,R1 XCH A,R0 MOV B,#18H CJNE R0,#00H,DVDL CLR A XCH A,R1 XCH A,R0 MOV B,#20H CJNE R0,#00H,DVDL SETB OV JMP END_DIV DVDL: MOV danyuan,#00H DVDL2: CLR C MOV A,R7 RLC A MOV R7,A MOV A,R6 RLC A MOV R6,A XCH A,R5 RLC A XCH A,R5 XCH A,R4 RLC A XCH A,R4 XCH A,danyuan RLC A XCH A,danyuan JC DVDL1 DVDL4: SUBB A,R3 MOV A,R5 SUBB A,R2 MOV A,R4 SUBB A,R1 MOV A,danyuan SUBB A,R0 JC DVDL3 DVDL1: CLR C MOV A,R6 SUBB A,R3 MOV R6,A MOV A,R5 SUBB A,R2 MOV R5,A MOV A,R4 SUBB A,R1 MOV R4,A MOV A,danyuan SUBB A,R0 MOV danyuan,A INC R7 DVDL3: DJNZ B,DVDL2 END_DIV: MOV R3,danyuan NOP ;停在这里看结果 END ;双字节除双字节的程序如下: ;51单片机双字节的除法 ;51单片机只是8位的,但有时候需要实现双字节除法,里面的指令只支持8位。 ;想来想去,只好用减法来实现了。下面这个子程序是双字节除以双字节,商、余数结果都是双字节保存,可能有点消耗资源,但这样可以整合在一块。 ;**************************************** ;函数名称:Div2Byte ;功能描述:无符号数双字节除法 ;传入参数:R0R1被除数 R2R3除数 ;返回数据:R4R5商 R6R7余数 ;其他说明:比如双字节数R0R1,R0高字节 R1低字节 ;**************************************** Div2Byte: mov r0,#0ffh mov r1,#0ffh mov r2,#0 mov r3,#254 mov R4,#0 mov R5,#0 ;商赋初值零 mov A,R0 mov R6,A mov A,R1 mov R7,A ;余数赋初值,保证商为零时余数正常 Div2Byte_1: mov A,R1 clr c subb A,R3 ;低字节相减 mov R1,A mov A,R0 subb A,R2 ;高位相减 mov R0,A jc Div2Byte_3 ;如果高字节都需要借位则退出循环 clr c mov A,R5 add A,#1 ;之后JNC判断,故不用INC mov R5,A jnc Div2Byte_2 inc R4 ;商加1 Div2Byte_2: mov A,R1 mov R7,A mov A,R0 mov R6,A ;更新余数 LJMP Div2Byte_1 Div2Byte_3: nop END ;两个程序均验证无误!我也是在网上抄来,然后调试的。在这里特别感谢提供这个程序并发到网上的同行们! ;我觉得我们搞单片机这一块的人都非常非常的友好,不象有的行当,学会了一点点就开始保密保守,那样事 ;业怎么可能发展?我的口号是: 不保密,不保守,共同提高。要想比别人更强更高,那就付出更多吧!