⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 乘法运算.asm

📁 基于51单片机的乘法运算程序
💻 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 + -