📄 div.asm
字号:
; Sub routine for Division.
S1 EQU 08H
S2 EQU 09H
S3 EQU 0AH
S4 EQU 0BH
E1 EQU 0CH
E2 EQU 0DH
E3 EQU 0EH
E4 EQU 0FH
W1 EQU 10H
W2 EQU 11H
W3 EQU 12H
W4 EQU 13H
K1 EQU 14H
K2 EQU 15H
K3 EQU 16H
K4 EQU 17H
CNT EQU 18H
MOV SP,#30H
MOV E1,#32H
MOV E2,#0DH
MOV E3,#00H
MOV E4,#43H
MOV S1,#10H
MOV S2,#00H
MOV S3,#50H
MOV S4,#0FH
MOV K1,#00H
MOV K2,#00H
MOV K3,#00H
MOV K4,#00H
;-----------------------32BIT / 32BIT DIVISION RUTINE-------------------
; avoide devide by zero error E/S = result(k)
MOV A,S1
ADD A,S2
JNZ DOWN
MOV A,S3
ADD A,S4
JNZ DOWN
ERROR:
DOWN:
; shift until substraction become less than zero, keep counting----------
MOV CNT,#00H
CALL SUB3224
JC ENDIT
DOAGAIN:
INC CNT
CALL SHIFTER24BITL
CALL SUB3224
JNC KHALI1
CALL SHIFTER24BITR
JMP LOOPBACK
DEC CNT
KHALI1:
MOV A,S1
JNB ACC.7,DOAGAIN
LOOPBACK:
CALL SUB3224
JC BELOW
MOV E1,W1
MOV E2,W2
MOV E3,W3
MOV E4,W4
;PUT ONE
SETB C
MOV A,K1
RLC A
MOV K1,A
MOV A,K2
RLC A
MOV K2,A
MOV A,K3
RLC A
MOV K3,A
MOV A,K4
RLC A
MOV K4,A
CLR C
;-------------
JMP OOOOO
BELOW:
;PUT ZERO
CLR C
MOV A,K1
ADD A,K1
MOV K1,A
MOV A,K2
RLC A
MOV K2,A
MOV A,K3
RLC A
MOV K3,A
MOV A,K4
RLC A
MOV K4,A
OOOOO: CLR C
;-------------
CALL SHIFTER24BITR
DJNZ CNT,LOOPBACK
RETT: JMP RETT
ENDIT:
MOV K1,#00H
MOV K2,#00H
MOV K3,#00H
MOV K4,#01H
RET
;----------------- 24-bit Shifter -----------------------------
SHIFTER24BITR:
;S1:S2:S3:S4
CLR C
MOV A,S1
RRC A
MOV S1,A
MOV A,S2
RRC A
MOV S2,A
MOV A,S3
RRC A
MOV S3,A
MOV A,S4
RRC A
MOV S4,A
CLR C
RET
SHIFTER24BITL:
MOV A,S4
ADD A,S4 ;RLC A
MOV S4,A
MOV A,S3
RLC A
MOV S3,A
MOV A,S2
RLC A
MOV S2,A
MOV A,S1
RLC A
MOV S1,A
CLR C
RET
;----------------- 32-BIT-24-BIT SUBSTARCTOR ---------------------
SUB3224:
;E1:E2:E3:E4 - S1:S2:S3:S4 = W1:W2:W3:W4
CLR C
MOV A,E4
SUBB A,S4
MOV W4,A
MOV A,E3
SUBB A,S3
MOV W3,A
MOV A,E2
SUBB A,S2
MOV W2,A
MOV A,E1
SUBB A,S1
MOV W1,A
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -