;********单片机汇编实现双字节除法*******;********2019-6-3 DXZ*********
DIVRA1 DATA 20H ;除数(低八位)
DIVRA2 DATA 21H
DIVDB1 DATA 22H ;被除数
DIVDB2 DATA 23H
QUOT2 DATA 24H ;商
QUOT1 DATA 25H
REMAIN2 DATA 26H ;余数
REMAIN1 DATA 27H
HIGHB DATA 28H ;移位子函数传递参数
LOWB DATA 29H
STOREC BIT 7EH ;保存C的状态
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV DIVRA1, #32H ;输入要计算的数
MOV DIVRA2, #1FH
MOV DIVDB1, #20H
MOV DIVDB2, #6EH
MOV QUOT1, #00H ;余数,商清零
MOV QUOT2, #00H
MOV REMAIN1, #00H
MOV REMAIN2, #00H
MOV R7, #16
STAT: MOV A,REMAIN2 ;余数移位
MOV HIGHB, A
MOV A, REMAIN1
MOV LOWB, A
LCALL TWORL ;移位子函数
MOV A, HIGHB
MOV REMAIN2, A
MOV A, LOWB
MOV REMAIN1, A
MOV C, DIVDB2.7;被除数移入余数
MOV REMAIN1.0, C
MOV HIGHB, A
MOV A, DIVDB1
MOV LOWB, A
LCALL TWORL
MOV A, HIGHB
MOV DIVDB2, A
MOV A, LOWB
MOV DIVDB1, A
MOV A, REMAIN2 ;比较余数和除数的大小
CJNE A, DIVRA2,SB ;判断高位是否相等
MOV A, REMAIN1 ;相等则比较低位
CJNE A, DIVRA1,$+3
SB:MOV STOREC, C ;不相等执行,先保存C的状态
MOV A, QUOT2
CLR C
RLC A
MOV QUOT2, A
MOV C, QUOT1.7
MOV QUOT2.0,C
CLR C
MOV A, QUOT1
RLC A
MOV QUOT1, A
MOV C, STOREC ;还原C
JC ANTHOR ;判断余数与除数大小
SETB QUOT1.0
MOV A, REMAIN1
SUBB A,DIVRA1
MOV REMAIN1, A
MOV A, REMAIN2
SUBB A, DIVRA2
MOV REMAIN2, A
DJNZ R7, STAT
SJMP $
ANTHOR: CLR QUOT1.0;余数比除数小,跳转
DEC R7
LJMP STAT
TWORL: MOV A, HIGHB ;双字节移位子函数
CLR C
RLC A
MOV HIGHB, A
MOV C, LOWB.7
MOV HIGHB.0, C
MOV A, LOWB
CLR C
RLC A
MOV LOWB, A
RET
END