除法32.asm

来自「基于51单片机的32位除法程序」· 汇编 代码 · 共 195 行

ASM
195
字号
;**********32位/32位无符号除法子程序*********************

;    入口:BDIV-BDIV+3 (4AH 4BH 4CH 4DH) 被除数(高位在前)
;         PDIV-PDIV+3 (32H 33H 34H 35H) 除数(低位在前)
;         BDIVBYT (被除数字节数)
;    R3:计数器  (32;被除数位数)
;    出口:BDIV-BDIV+3 (4AH 4BH 4CH 4DH) 商(高位在前)
;         DIV_C-DIV_C+3 (3AH 3BH 3CH 3DH):部分余数
;    用到寄存器 PBDIV-PBDIV+2(37H 38H 39H)  (暂存差数)

DIV32:
    CLR         A
    MOV R0,#DIV_C
    MOV R7,#BDIVBYT
 CLRDIV_C:
    MOV @R0,A
    INC R0
    DJNZ R7,CLRDIV_C
       
   ; mov         DIV_C,a
   ; mov         DIV_C+1,a
   ; mov         DIV_C+2,a
   ; mov         DIV_C+3,a
   
    mov         r3,#BDIVBYT
DIV1:
    ;ACALL       RLC8
    ;mov         r1,#PDIV
    ACALL       RLC64
    MOV R1,#PDIV
    MOV R0,#DIV_C
    MOV R4,#PDIV
    MOV R7,#bdivbyt
    MOV R6,#PBDIV
DIV2:
    MOV A,R4
    MOV R1,A    ;还原 PDIV (除数地址) R4

    MOV A,@R0
    SUBB A,@R1  ; DIV_C-PDIV
    MOV R5,A    ;暂存

    MOV A,R1    ;暂存 PDIV
    MOV R4,A

    MOV A,R6   ;还原 PBDIV (暂存差地址) R1
    MOV R1,A
    MOV A,R5
    MOV @R1,A

    INC R0      ; 余数 DIV_C
    INC R6      ; 暂存差 PBDIV 暂存差
    INC R4      ; 除数 PDIV

    DJNZ R7,DIV2

    JC NEXT1    
    
;    mov         a,DIV_C+3
;    subb        a,@r1
;    mov         PBDIV+2,a
;    inc         r1
;
;    mov         a,DIV_C+2
;    subb        a,@r1
;    mov         PBDIV+1,a
;    inc         r1
;
;    mov         a,DIV_C+1
;    subb        a,@r1
;    mov         PBDIV,a
;    inc         r1
;
;    mov         a,DIV_C
;    subb        a,@r1
;;
 ;   JC          NEXT1
;    INC         BDIV+3
;    mov         DIV_C,A
;    mov         DIV_C+1,PBDIV
;    mov         DIV_C+2,PBDIV+1
;    mov         DIV_C+3,PBDIV+2

    INC         BDIV  ;*******
    mov         DIV_C,A
    mov r1,#div_c+1
    MOV R0,#PBDIV
    mov r7,#bdivbyt
    
rdiv_c:
    MOV A,@R0
    MOV @R1,A
    INC R0
    INC R1
    djnz r7,Rdiv_c
    
NEXT1:
    DJNZ        r3,DIV1
    mov         a,DIV_C           ;取部分余数,  作四舍五入处理
    rlc         a
    jC          round1
    mov         a,DIV_C+2
    rlC         a
    mOV         DIV_C+2,a

    mOV         a,DIV_C+1
    rlC         a
    mOV         DIV_C+1,a

  mOV           a,DIV_C+1
  rlC           a
  moV           DIV_C+1,a

  mOV           a,DIV_C
  rlC           a
  moV           DIV_C,a

  SUbb          a,PDIV
  jC            donZ1
  jnZ           roUnd1

  mOV           a,DIV_C+1
  SUbb          a,PDIV+1
  jC            dOnZ1
  jnz           roUnd1

  mOV           a,DIV_C+2
  SUbb          a,PDIV+2
  jC            donZ1
  jnZ           roUnd1

  moV           a,DIV_C+3
  Subb          a,PDIV+3
  jC            donz1
rOUnd1:
    lCall       add41
dOnZ1:
    Clr         a
    RET

RLC8:
    CLR         C
    mOV         a,BDIV+3
    rlC         a
    moV         BDIV+3,a

    moV         a,BDIV+2
    rlc         a
    moV         BDIV+2,a

    moV         a,BDIV+1
    rlC         a
    mOV         BDIV+1,a

    moV         a,BDIV
    rlc         a
    mov         BDIV,a

    mov         a,DIV_C+3
    rlc         a
    mov         DIV_C+3,a

    mov         a,DIV_C+2
    rlc         a
    mov         DIV_C+2,a

    mov         a,DIV_C+1
    rlc         a
    mov         DIV_C+1,a

    mov         a,DIV_C
    rlc         a
    mov         DIV_C,a
    RET
;***************************
add41:
    mov         a,BDIV+3
    add         a,#01h
    mov         BDIV+3,a

    mov         a,BDIV+2
    addc        a,#00h
    mov         BDIV+2,a

    mov         a,BDIV+1
    addc        a,#00h
    mov         BDIV+1,a

    mov         a,BDIV
    addc        a,#00h
    mov         BDIV,a
    ret
;************************************

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?