📄 乘法运算.asm
字号:
;*
bdiv equ 30h ;被除数(高位在前) (60H-63H)
pdiv equ 34h ;除数(低位在前) (64H-67H)
div_c equ 38h ;部分余数(高位在前) (68H-6BH)
pbdiv equ 3ch ;暂存差 (6CH-6EH)
BMUL EQU 30H ;被乘数低地址指针(30H-33H)
PMUL EQU 34H ;乘数低地址指针 (34H-37H)
MULJI EQU 38H ;积的低字节地址指针 (38H-3FH)
BMULBYT EQU 50H ;被乘数字节数
PMULBYT EQU 51H ;乘数字节数
MULJIBYT EQU 52H ;积的字节数
MULADD EQU 54H ;暂存积
;打印的数据存放格式:
; 含油率值(??.??%)+质量值(??.???G)+时间值(?)+编号值(??)
; 6 位数 7 位数 1 位数 2 位数
;共占字节 16 BYTES (50H-5FH)
;**********32位/32位无符号除法子程序*********************
; 入口:BDIV-BDIV+3 (4AH 4BH 4CH 4DH) 被除数(高位在前)
; PDIV-PDIV+3 (32H 33H 34H 35H) 除数(低位在前)
; R3:计数器 (32;被除数位数)
; 出口:BDIV-BDIV+3 (4AH 4BH 4CH 4DH) 商(高位在前)
; DIV_C-DIV_C+3 (3AH 3BH 3CH 3DH):部分余数
; 用到寄存器 PBDIV-PBDIV+2(37H 38H 39H) (暂存差数)
ORG 0000H
AJMP 0030H
ORG 0030H
NOP
MOV 30h,#05H
MOV 31h,#33H
MOV 32h,#23H
MOV 33H,#44H
MOV 34H,#0A0H
MOV 35H,#0C4H
MOV 36H,#00H ;
MOV 37H,#00H
;
MOV 38H,#00H
MOV 39H,#00H
MOV 3AH,#00H
MOV 3BH,#00H
MOV 3CH,#39H
MOV 3DH,#47H ;
MOV 3EH,#36H ;
MOV 3FH,#33H
MOV R1,#BMUL
MOV R0,#PMUL
MOV R2,#04H
MOV R3,#02H
MOV R4,#MULJI
LCALL DOMUL
; LCALL DIV32
ljmp $
;*****************************************************************************
; 乘法(多字节无符号数)
;*****************************************************************************
; ====说明====
;
; 入口:R1(被乘数低位字节地址指针);R0(乘数低位字节地址指针);R2(被乘数字节数)
;R3(乘数字节数);R4(积的低位字节地址指针)
; 出口:R4(积的低位字节地址指针);R5(积的字节数)
; 使用:REG A R0 R1 R2 R3 R4 R5 R6 R7
; RAM 20H 21H 26H 27H
;
;***** BMUL EQU 40H ;被乘数低地址指针
; PMUL EQU 30H ;乘数低地址指针
; BMULBYT EQU 50H ;被乘数字节数
; PMULBYT EQU 51H ;乘数字节数
; MULJI EQU 70H ;积的低字节地址指针
; MULJIBYT EQU 52H ;积的字节数
; MULADD EQU 60H ;暂存积
;************************************************************************
;
; ====程序====
DOMUL:
MOV A,R1 ;复制保持地址指针
MOV R6,A
MOV A,R0
MOV R5,A
MOV A,R2
ADD A,R3
MOV 26H,A
MOV R7,A
MOV A,R4
MOV R0,A
MOV 21H,R4
DOMUL_CLEAR:
MOV @R0,#00H ;积单元清零
INC R0
DJNZ R7,DOMUL_CLEAR
MOV R0,MULADD
MOV R7,26H
MULADD_CLR:
MOV @R0,#00H ;积单元清零
INC R0
DJNZ R7,MULADD_CLR
MOV A,R4 ;求乘积
MOV R7,A
MOV 27H,R7
MOV 20H,R2
DOMUL_LP0:
MOV A,R5
MOV R0,A
MOV A,@R0
MOV B,@R1
MUL AB
MOV 53H,R1 ;****
ACALL MULAD;*********
;ACALL DOMUL_ADDM
MOV R1,53H ;****
INC R1
DJNZ R2,DOMUL_LP0
LCALL MULJIE
MOV MULADD,#60H
MOV R0,MULADD
MOV R7,26H
MULADD_CLR1:
MOV @R0,#00H ;积单元清零
INC R0
DJNZ R7,MULADD_CLR1
MOV R2,20H
MOV A,R6
MOV R1,A
INC R5
DJNZ R3,DOMUL_LP0
MOV R4,27H ;恢复地址指针
MOV R5,26H
RET
DOMUL_ADDM:
MOV 21H,A ;加部分积
MOV A,R4
MOV R0,A
MOV A,21H
ADD A,@R0
MOV @R0,A
MOV A,B
INC R0
ADDC A,@R0
MOV @R0,A
INC R0
MOV A,@R0
ADDC A,#00H
MOV @R0,A
DEC R0
MOV A,R0
MOV R4,A
RET
MULAD:
MOV R1,MULADD
ADD A,@R1
MOV @R1,A
MOV A,B
INC R1
ADDC A,@R1
MOV @R1,A
INC R1
MOV A,@R1
ADDC A,#00H
MOV @R1,A
DEC R1
MOV MULADD,R1
RET
MULJIE:
MOV R0,21H
MOV R1,#MULADD;60H
MOV A,@R0
ADD A,@R1
MOV @R0,A
INC R0
INC R1
MOV 21H,R0
MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
MOV A,@R0
ADDC A,#00H
MOV @R0,A
RET
;****************************完毕*********************************
;**********32位/32位无符号除法子程序*********************
; 入口:BDIV-BDIV+3 (4AH 4BH 4CH 4DH) 被除数(高位在前)
; PDIV-PDIV+3 (32H 33H 34H 35H) 除数(低位在前)
; 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 DIV_C,a
mov DIV_C+1,a
mov DIV_C+2,a
mov DIV_C+3,a
mov r3,#32
DIV1:
ACALL RLC8
mov r1,#PDIV
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
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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -