📄 bcd_div.asm
字号:
;被除数由高到低存于TEMP_STR-->TEMP_STR+4中,除数存于TEMP_STR+10-->TEMP_STR+14中,
;运算后商存于TEMP_STR-->TEMP_STR+4中,余数存于TEMP_STR+5-->TEMP_STR+9中
;高字节在前
;方法:移位相除
;10位BCD码除法 XUE:20080729
TEMP_STR EQU 30H
ORG 000
STAR: MOV R0,#TEMP_STR ;被除数首址
MOV R1,#TEMP_STR+10;除数首址
MOV R3,#05H ;被除数字节数
BCD_DIV_A: MOV A,R3 ;
ADD A,R3 ;
MOV R6,A ;
ADD A,R0 ;
MOV R0,A ;
DEC R0 ;r0-->被除数的最底位
BCD_DIV_B: CLR A ;
MOV R2,#10 ;
BCD_DIV_0: XCH A,@R0 ;((r0)-(r0)+2*(r3)-1)<<4,高4位-->R4
SWAP A ;
XCHD A,@R0 ;
XCH A,@R0 ;
DEC R0 ;
DJNZ R2,BCD_DIV_0 ;
ADD A,TEMP_STR+9 ;
MOV TEMP_STR+9,A ;被除数最高位移入余数的最低位
MOV A,R3 ;
ADD A,R3 ;
ADD A,R0 ;
MOV R0,A ;
MOV A,R1 ;
ADD A,R3 ;
MOV R1,A ;
DEC R1 ;
BCD_DIV_C: MOV R5,#05H ;余数减除数
SETB C ;
BCD_DIV_1: CLR A ;
ADDC A,#99H ;
SUBB A,@R1 ;
ADD A,@R0 ;
DA A ;
MOV @R0,A ;
DEC R0 ;
DEC R1 ;
DJNZ R5,BCD_DIV_1 ;
CPL C ;
JC BCD_DIV_2 ;不够减
INC TEMP_STR+4 ;够减被除数的最低位+1
MOV A,R3;
ADD A,R0;
MOV R0,A;
ADD A,R3;
MOV R1,A;
JMP BCD_DIV_C ;继续做减法
BCD_DIV_2: MOV A,R3 ;
ADD A,R0 ;
MOV R0,A ;
MOV A,R3 ;
ADD A,R1 ;
MOV R1,A ;
MOV R2,#5 ;
BCD_DIV_3: MOV A,@R0 ;余数单元+除数恢复余数单元原值
ADDC A,@R1 ;
DA A ;
MOV @R0,A ;
DEC R0 ;
DEC R1 ;
DJNZ R2,BCD_DIV_3 ;
MOV A,R3;
ADD A,R0;
MOV R0,A;
INC R1 ;
DJNZ R6,BCD_DIV_B ;继续移位
JMP $
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -