三星单片机8位机汇编语言除法宏指令集
文章来源: 本站原创   更新时间: 2014-05-22
;--------------------------------------------------
;这是三星八位单片机的宏定义集
;--------------------------------------------------
;这是清寄存器某一位为零的宏指令定义
;指令格式: CLRBIT REGISTER,REGBIT
;CLRBIT-----宏指令名
;REGISTER---欲操作的寄存器
;REGBIT-----欲清零的寄存器位
;---------------------------------
CLRBIT: MACRO REGISTER,REGBIT
        
        .IF REGBIT==0
            AND REGISTER,#0FEH
        .ENDIF
        .IF REGBIT==1
            AND REGISTER,#0FDH
        .ENDIF
        .IF REGBIT==2
            AND REGISTER,#0FBH
        .ENDIF
        .IF REGBIT==3
            AND REGISTER,#0F7H
        .ENDIF
        .IF REGBIT==4
            AND REGISTER,#0EFH
        .ENDIF
        .IF REGBIT==5
            AND REGISTER,#0DFH
        .ENDIF
        .IF REGBIT==6
            AND REGISTER,#0BFH
        .ENDIF
        .IF REGBIT==7
            AND REGISTER,#07FH
        .ENDIF
     
        .ENDM
;--------------------------------------------------------
;这是置寄存器某一位为1的宏指令定义
;指令格式: SETBIT REGISTER,REGBIT
;SETBIT-----宏指令名
;REGISTER---欲操作的寄存器
;REGBIT-----欲置1的寄存器位
;---------------------------
SETBIT: MACRO REGISTER,REGBIT

       .IF REGBIT==0
            OR REGISTER,#01H
        .ENDIF
        .IF REGBIT==1
            OR REGISTER,#02H
        .ENDIF
        .IF REGBIT==2
            OR REGISTER,#04H
        .ENDIF
        .IF REGBIT==3
            OR REGISTER,#08H
        .ENDIF
        .IF REGBIT==4
            OR REGISTER,#10H
        .ENDIF
        .IF REGBIT==5
            OR REGISTER,#20H
        .ENDIF
        .IF REGBIT==6
            OR REGISTER,#40H
        .ENDIF
        .IF REGBIT==7
            OR REGISTER,#80H
        .ENDIF
.ENDM
;--------------------------------------------------------
;这是测试寄存器某一位状态的宏指令定义
;指令格式: TESTBIT REGISTER,REGBIT
;TMBIT-----宏指令名
;REGISTER---欲操作的寄存器
;REGBIT-----欲测试的寄存器位
;---------------------------
TMBIT: MACRO REGISTER,REGBIT
        
        .IF REGBIT==0
                TM REGISTER,#01H
        .ENDIF
        .IF REGBIT==1
                TM REGISTER,#02H
        .ENDIF
        .IF REGBIT==2
                TM REGISTER,#04H
        .ENDIF
        .IF REGBIT==3
                TM REGISTER,#08H
        .ENDIF
        .IF REGBIT==4
                TM REGISTER,#10H
        .ENDIF
        .IF REGBIT==5
                TM REGISTER,#20H
        .ENDIF
        .IF REGBIT==6
                TM REGISTER,#40H
        .ENDIF
        .IF REGBIT==7
                TM REGISTER,#80H
        .ENDIF
.ENDM
;------------------------------------------------
;这是取反寄存器某一位状态的宏指令定义
;指令格式: XORBIT REGISTER,REGBIT
;XORBIT-----宏指令名
;REGISTER---欲操作的寄存器
;REGBIT-----欲清零的寄存器位
;----------------------------
XORBIT: MACRO REGISTER,REGBIT

        .IF REGBIT==0
                XOR REGISTER,#01H
        .ENDIF
        .IF REGBIT==1
                XOR REGISTER,#02H
        .ENDIF
        .IF REGBIT==2
                XOR REGISTER,#04H
        .ENDIF
        .IF REGBIT==3
                XOR REGISTER,#08H
        .ENDIF
        .IF REGBIT==4
                XOR REGISTER,#10H
        .ENDIF
        .IF REGBIT==5
                XOR REGISTER,#20H
        .ENDIF
        .IF REGBIT==6
                XOR REGISTER,#40H
        .ENDIF
        .IF REGBIT==7
                XOR REGISTER,#80H
        .ENDIF
.ENDM
;----------------------------------------------------
;这是两个16位寄存器相加的宏
;REG_H1----被加数高位字节
;REG_L2----被加数低位字节
;REG_H2----加数高位字节
;REG_L2----加数低位字节
;相加结果在被加数中
ADD16: MACRO REG_H1,REG_L1,REG_H2,REG_L2
        ADD REG_L1,REG_L2
        ADC REG_H1,REG_H2
.ENDM
;--------------------------------------------------------
;这是两个16位寄存器相减的宏
;REG_H1----被减数高位字节
;REG_L2----被减数低位字节
;REG_H2----减数高位字节
;REG_L2----减数低位字节
;相减结果在被减数中
SUB16: MACRO REG_H1,REG_L1,REG_H2,REG_L2
        SUB REG_L1,REG_L2
        SBC REG_H1,REG_H2
.ENDM
;-----------------------------------------------------------
;这是一个延时几个NOP周期的宏
;注意: 该宏最多可以插入10个NOP,超过者将视作无效,不插入任何NOP
DELAY: MACRO CYCLES
        .IF CYCLES == 1
                NOP
        .ENDIF
        .IF CYCLES == 2
                NOP
                NOP
        .ENDIF
        .IF CYCLES == 3
                NOP
                NOP
                NOP
        .ENDIF
        .IF CYCLES == 4
                NOP
                NOP
                NOP
                NOP
        .ENDIF
        .IF CYCLES == 5
                NOP
                NOP
                NOP
                NOP
                NOP
        .ENDIF
        .IF CYCLES == 6
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
        .ENDIF
        .IF CYCLES == 7
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
        .ENDIF
        .IF CYCLES == 8
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
        .ENDIF
        .IF CYCLES == 9
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
        .ENDIF
        .IF CYCLES == 10
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
        .ENDIF
.ENDM
;--------------------------------------------------------------
;该过程实现一个无符号的24位二进制数与一个16位二进制数相乘
;输入:
;被乘数:
; R1(字节1),R2(字节2),R3(字节3),R4(低位字节)
;乘数:
; R6(字节1),R7(字节2),R8(字节3),R9(低位字节)
;输出乘积值:
; R10:R11:R12:R13:R14:R15
;本例中被乘数仅用到:R1,R2,R3,R4
;本例中乘数仅用到: R8,R9
;本例中乘积仅用到: R10,R11,R12,R13,R14,R15
;另外: R0:R1 被用作计算时被乘数临时最高位字节
; R10 被用作计算时计算时的循环计数器(16)
;------------------------
;注: 在宏中出现的所有标号均被自动处理成局域标号
UMUL3216_MACRO: MACRO
;该宏于20140513验证OK
;-----------------------
        PUSH R6 ;R6:R7用作临时被乘数高位字节
        PUSH R7
        PUSH R0 ;R0用作循环计数器
        
        
        CLR R6 ;R6:R7用作临时被乘数高位字节
        CLR R7
       
        CLR R10
        CLR R11
        CLR R12
        CLR R13 ;清乘积值为0
        CLR R14
        CLR R15
        ;-----------------
_START:
        LD R0,#16
_LOOP:
        RCF
        RRC R8
        RRC R9 ;右移乘数值一位,并检测该位状态
        JR NC,_SHF
        ;如果乘数当前位=1,则加乘积值
        ADD R15,R4
        ADC R14,R3
        ADC R13,R2
        ADC R12,R1
        ADC R11,R7
        ADC R10,R6
_SHF:
        RCF ;首先必须清C=0
        RLC R4
        RLC R3
        RLC R2
        RLC R1
   
        RLC R7
        RLC R6
        DEC R0
        JR NZ,_LOOP
        ;8次循环完毕,则完成退出
_BACK:
        POP R0
        POP R7
        POP R6
;------------------
.ENDM
;--------------------------------------------------------------
;该过程实现一个无符号的24位二进制数与一个16位二进制数相乘
;输入:
;被乘数:
; R1(字节1),R2(字节2),R3(字节3),R4(低位字节)
;乘数:
; R6(字节1),R7(字节2),R8(字节3),R9(低位字节)
;输出乘积值:
; R11,R12(字节1),R13(字节2),R14(字节3),R15(低位字节)
;本例中被乘数仅用到: R2,R3,R4
;本例中乘数仅用到: R8,R9
;本例中乘积仅用到: R11,R12,R13,R14,R15
;另外: R0:R1 被用作计算时被乘数临时最高位字节
; R10 被用作计算时计算时的循环计数器(16)
;------------------------
;注: 在宏中出现的所有标号均被自动处理成局域标号
UMUL2416_MACRO: MACRO
;该宏于20140511验证OK
;-----------------------
        PUSH R10
        PUSH R0
        PUSH R1
        
        
        CLR R0 ;R2用作临时被乘数高位字节
        CLR R1
       
        CLR R11
        CLR R12
        CLR R13 ;清乘积值为0
        CLR R14
        CLR R15
        ;-----------------
_START:
        LD R10,#16
_LOOP:
        RCF
        RRC R8
        RRC R9 ;右移乘数值一位,并检测该位状态
        JR NC,_SHF
        ;如果乘数当前位=1,则加乘积值
        ADD R15,R4
        ADC R14,R3
        ADC R13,R2
        ADC R12,R1
        ADC R11,R0
_SHF:
        RCF ;首先必须清C=0
        RLC R4
        RLC R3
        RLC R2
   
        RLC R1
        RLC R0
        DEC R10
        JR NZ,_LOOP
        ;8次循环完毕,则完成退出
_BACK:
        POP R1
        POP R0
        POP R10
;------------------
.ENDM
;--------------------------------------------------------------
;该过程实现一个无符号的十六位二进制数与一个16位二进制数相乘
;输入:
;被乘数:
; R1(字节1),R2(字节2),R3(字节3),R4(低位字节)
;乘数:
; R6(字节1),R7(字节2),R8(字节3),R9(低位字节)
;输出乘积值:
; R12(字节1),R13(字节2),R14(字节3),R15(低位字节)
;本例中被乘数仅用到: R3,R4
;本例中乘数仅用到: R8,R9
;本例中乘积仅用到: R12,R13,R14,R15
;另外: R0:R1 被用作计算时被乘数临时最高位字节
; R10 被用作计算时计算时的循环计数器(16)
;------------------------
;注: 在宏中出现的所有标号均被自动处理成局域标号
UMUL1616_MACRO: MACRO
;该宏于20140511验证通过
;-----------------------
        PUSH R10
        PUSH R0
        PUSH R1
        
        
        CLR R0 ;R2用作临时被乘数高位字节
        CLR R1
        
        CLR R12
        CLR R13 ;清乘积值为0
        CLR R14
        CLR R15
        ;-----------------
_START:
        LD R10,#16
_LOOP:
        RCF
        RRC R8
        RRC R9 ;右移乘数值一位,并检测该位状态
        JR NC,_SHF
        ;如果乘数当前位=1,则加乘积值
        ADD R15,R4
        ADC R14,R3
        ADC R13,R1
        ADC R12,R0
_SHF:
        RCF ;首先必须清C=0
        RLC R4
        RLC R3
        RLC R1
        RLC R0
        DEC R10
        JR NZ,_LOOP
        ;8次循环完毕,则完成退出
_BACK:
        POP R1
        POP R0
        POP R10
;------------------
.ENDM
;---------------------------------------------------------------
;该过程实现一个无符号的十六位二进制数与一个八位二进制数相乘
;输入:
;被乘数:
; R1(字节1),R2(字节2),R3(字节3),R4(低位字节)
;乘数:
; R6(字节1),R7(字节2),R8(字节3),R9(低位字节)
;输出乘积值:
; R12(字节1),R13(字节2),R14(字节3),R15(低位字节)
;本例中被乘数仅用到: R3,R4
;本例中乘数仅用到: R9
;本例中乘积仅用到: R13,R14,R15
;另外: R0 被用作计算时被乘数临时最高位字节
; R10 被用作计算时计算时的循环计数器(8)
;------------------------
;注: 在宏中出现的所有标号均被自动处理成局域标号
UMUL1608_MACRO: MACRO
;该宏于20140511验证OK
;-----------------------
        PUSH R10
        PUSH R0
        
        
        CLR R0 ;R2用作临时被乘数高位字节
        CLR R13 ;清乘积值为0
        CLR R14
        CLR R15
        ;-----------------
_START:
        LD R10,#08H
_LOOP:
        RCF
        RRC R9 ;右移乘数值一位,并检测该位状态
        JR NC,_SHF
        ;如果乘数当前位=1,则加乘积值
        ADD R15,R4
        ADC R14,R3
        ADC R13,R0
_SHF:
        RCF ;首先必须清C=0
        RLC R4
        RLC R3
        RLC R0
        DEC R10
        JR NZ,_LOOP
        ;8次循环完毕,则完成退出
_BACK:
        POP R0
        POP R10
;------------------
.ENDM
;--------------------------------------------------
;该宏实现两个无符号的八位二进制数相乘
;输入:
;被乘数:
; R1(字节1),R2(字节2),R3(字节3),R4(低位字节)
;乘数:
; R6(字节1),R7(字节2),R8(字节3),R9(低位字节)
;输出乘积值:
; R12(字节1),R13(字节2),R14(字节3),R15(低位字节)
;本例中被乘数仅用到: R4
;本例中乘数仅用到: R9
;本例中乘积仅用到: R14,R15
;另外: R0 被用作计算时被乘数临时最高位字节
; R10 被用作计算时计算时的循环计数器(8)
;-------------------------
;该宏于20140511验证OK
UMUL0808_MACRO: MACRO
;--------------------------
        PUSH R0
        PUSH R10
        
        CLR R0 ;R3用作临时被乘数高位字节
        CLR R14
        CLR R15
        ;---------------
        
        LD R10,#08H
_LOOP:
        RCF
        RRC R9 ;右移乘数值一位,并检测该位状态
        JR NC,_SHF ;如果该位=0,则转
        ;如果乘数当前位=1,则加乘积值
        ADD R15,R4
        ADC R14,R0
_SHF:
        ;然后将被乘数左移一位
        RCF ;首先必须清C=0
        RLC R4
        RLC R0
        DEC R10
        JR NZ,_LOOP
_BACK:
        POP R10
        POP R0
;--------------------
.ENDM
;这是实现一个48位数与一个24位数相除的过程
;输入:
;被除数:
; R1:R2:R3:R4:R5:R6
;除数:
; R7:R8:R9
;输入商值:
; R10:R11:R12:R13:R14:R15
;余数值退出时在原被除数中存放
;如果除数为0,则返回R0=0FFH以指示除数0错误,否则R0=0
;----------------------
;该宏于20140513验证OK
UDIV4824_MACRO: MACRO
        PUSH 00H
        PUSH 01H
        PUSH 02H
        PUSH 03H
        PUSH 04H
        PUSH 05H
        PUSH 0AH
        
        ;予清商数为0
        CLR R10
        CLR R11
        CLR R12
        CLR R13
        CLR R14
        CLR R15
        ;检测除数是否为0
        CP R7,#00H
        JR NE,_ST
        CP R8,#00H
        JR NE,_ST
        CP R9,#00H
        JR NE,_ST
        ;如果除数为零,则错误,返回R0=0FFH
        LD R0,#0FFH
        JP _BACK
_ST:
        ;予清被除数临时字节为0
        CLR 00H
        CLR 01H
        CLR 02H
        CLR 03H
        CLR 04H
        CLR 05H
        LD R0,#30H
_LOOP:
        ;予清商位为0
        RCF
        RLC R15
        RLC R14
        RLC R13
        RLC R12
        RLC R11
        RLC R10
        ;将被除数最高位依次移入临时字节中并与除数进行比较
        RCF ;必须予清C=0
        RLC R6
        RLC R5
        RLC R4
        RLC R3
        RLC R2
        RLC R1
        RLC 05H
        RLC 04H
        RLC 03H
        RLC 02H
        RLC 01H
        RLC 00H
               
               ;暂存值
        PUSH 05H
        PUSH 04H
        PUSH 03H
        PUSH 02H
        PUSH 01H
        PUSH 00H
        ;比较高位字节大小
        SUB 05H,R9
        SBC 04H,R8
        SBC 03H,R7
        SBC 02H,#0
        SBC 01H,#0
        SBC 00H,#0
        JR C,_POP
        ;如果被除数高位大于或等于除数,则置该位商为1
        OR R15,#01H
        ;比较成功,则平衡栈操作
        POP 0AH
        POP 0AH
        POP 0AH
        POP 0AH
        POP 0AH
        POP 0AH
        JR _SHF
_POP:
        ;比较不成功,则复原R10,R11值
        POP 00H
        POP 01H
        POP 02H
        POP 03H
        POP 04H
        POP 05H
_SHF:
        DEC R0
        JR NZ,_LOOP
        ;最后重新调入余数值到原被除数中
        LD R1,00H
        LD R2,01H
        LD R3,02H
        LD R4,03H
        LD R5,04H
        LD R6,05H
_BACK:
        POP 0AH
        POP 05H
        POP 04H
        POP 03H
        POP 02H
        POP 01H
        POP 00H
;---------------
.ENDM
;---------------------------------------------------------
;这是实现一个32位数与一个24位数相除的过程
;输入:
;被除数:
; R1(字节1),R2(字节2),R3(字节3),R4(低位字节)
;除数:
; R7(字节2),R8(字节3),R9(低位字节)
;输入商值:
; R12(字节1),R13(字节2),R14(字节3),R15(低位字节)
;本例中被除数仅用到: R1,R2,R3,R4
;本例中除数仅用到: R7,R8,R9
;本例中商值仅用到: R12,R13,R14,R15
;余数值退出时在原被除数中存放
;另外: R5 被用作计算时被除数临时最高位两字节
; R0 被用作计算时计算时的循环计数器(8)
; R5 被用作暂存数据时平衡栈操作
;如果除数为0,则返回R0=0FFH以指示除数0错误,否则R0=0
;----------------------
;该宏于20140511验证OK
UDIV3224_MACRO: MACRO
        PUSH 00H
        PUSH 01H
        PUSH 02H
        PUSH 03H
        PUSH R5
        
        ;予清商数为0
        CLR R12
        CLR R13
        CLR R14
        CLR R15
        ;检测除数是否为0
        CP R7,#00H
        JR NE,_ST
        CP R8,#00H
        JR NE,_ST
        CP R9,#00H
        JR NE,_ST
        ;如果除数为零,则错误,返回R0=0FFH
        LD R0,#0FFH
        JR _BACK
_ST:
        ;予清被除数临时字节为0
        CLR 00H
        CLR 01H
        CLR 02H
        CLR 03H
        LD R0,#20H
_LOOP:
        ;予清商位为0
        RCF
        RLC R15
        RLC R14
        RLC R13
        RLC R12
        ;将被除数最高位依次移入临时字节中并与除数进行比较
        RCF ;必须予清C=0
        RLC R4
        RLC R3
        RLC R2
        RLC R1
        RLC 03H
        RLC 02H
        RLC 01H
        RLC 00H
               
               ;暂存R10,R11值
        PUSH 03H
        PUSH 02H
        PUSH 01H
        PUSH 00H
        ;比较高位字节大小
        SUB 03H,R9
        SBC 02H,R8
        SBC 01H,R7
        SBC 00H,#0
        JR C,_POP
        ;如果被除数高位大于或等于除数,则置该位商为1
        OR R15,#01H
        ;比较成功,则平衡栈操作
        POP R5
        POP R5
        POP R5
        POP R5
        JR _SHF
_POP:
        ;比较不成功,则复原R10,R11值
        POP 00H
        POP 01H
        POP 02H
        POP 03H
_SHF:
        DEC R0
        JR NZ,_LOOP
        ;最后重新调入余数值到原被除数中
        LD R1,00H
        LD R2,01H
        LD R3,02H
        LD R4,03H
_BACK:
        POP R5
        POP 03H
        POP 02H
        POP 01H
        POP 00H
;---------------
.ENDM
;---------------------------------------------------------
;这是实现一个24位数与一个24位数相除的过程
;输入:
;被除数:
; R2(字节2),R3(字节3),R4(低位字节)
;除数:
; R7(字节2),R8(字节3),R9(低位字节)
;输入商值:
; R13(字节2),R14(字节3),R15(低位字节)
;本例中被除数仅用到: R2,R3,R4
;本例中除数仅用到: R7,R8,R9
;本例中商值仅用到: R13,R14,R15
;余数值退出时在原被除数中存放
;另外: R6,R10,R11 被用作计算时被除数临时最高位两字节
; R0 被用作计算时计算时的循环计数器(8)
; R5 被用作暂存数据时平衡栈操作
;如果除数为0,则返回R0=0FFH以指示除数0错误,否则R0=0
;----------------------
;该宏于20140511验证OK
UDIV2424_MACRO: MACRO
        PUSH R11
        PUSH R10
        PUSH R6
        PUSH R5

        ;予清商数为0
        CLR R13
        CLR R14
        CLR R15
        ;检测除数是否为0
        CP R7,#00H
        JR NE,_ST
        CP R8,#00H
        JR NE,_ST
        CP R9,#00H
        JR NE,_ST
        ;如果除数为零,则错误,返回R0=0FFH
        LD R0,#0FFH
        JR _BACK
_ST:
        ;予清被除数临时字节为0
        CLR R6
        CLR R10
        CLR R11
        LD R0,#18H
_LOOP:
        ;予清商位为0
        RCF
        RLC R15
        RLC R14
        RLC R13
        ;将被除数最高位依次移入临时字节中并与除数进行比较
        RCF ;必须予清C=0
        RLC R4
        RLC R3
        RLC R2
        RLC R11
        RLC R10
        RLC R6
               
               ;暂存R10,R11值
               PUSH R11
               PUSH R10
               PUSH R6
        ;比较高位字节大小
        SUB R11,R9
        SBC R10,R8
        SBC R6,R7
        JR C,_POP
        ;如果被除数高位大于或等于除数,则置该位商为1
        OR R15,#01H
        ;比较成功,则平衡栈操作
        POP R5
        POP R5
        POP R5
        JR _SHF
_POP:
        ;比较不成功,则复原R10,R11值
        POP R6
        POP R10
        POP R11
_SHF:
        DEC R0
        JR NZ,_LOOP
       
        LD R2,R6
        LD R3,R10
        LD R4,R11
_BACK:
        POP R5
        POP R6
        POP R10
        POP R11
;---------------------
.ENDM
;---------------------------------------------------------
;这是实现一个24位数与一个16位数相除的过程
;输入:
;被除数:
; R1(字节1),R2(字节2),R3(字节3),R4(低位字节)
;除数:
; R6(字节1),R7(字节2),R8(字节3),R9(低位字节)
;输入商值:
; R12(字节1),R13(字节2),R14(字节3),R15(低位字节)
;本例中被除数仅用到: R2,R3,R4
;本例中除数仅用到: R8,R9
;本例中商值仅用到: R13,R14,R15
;余数值退出时在原被除数中存放
;另外: R10,R11 被用作计算时被除数临时最高位两字节
; R0 被用作计算时计算时的循环计数器(8)
; R5 被用作暂存数据时平衡栈操作
;如果除数为0,则返回R0=0FFH以指示除数0错误,否则R0=0
;----------------------
;该宏在20140511验证OK
UDIV2416_MACRO: MACRO
;-------------------------
        PUSH R12
        PUSH R11
        PUSH R10
        PUSH R5

        ;予清商数为0
        CLR R13
        CLR R14
        CLR R15
        ;检测除数是否为0
        CP R8,#00H
        JR NE,_ST
        CP R9,#00H
        JR NE,_ST
        ;如果除数为零,则错误,返回R0=0FFH
        LD R0,#0FFH
        JR _BACK
_ST:
        ;予清被除数临时字节为0
        CLR R10
        CLR R11
        CLR R12
        LD R0,#18H
_LOOP:
        ;予清商位为0
        RCF
        RLC R15
        RLC R14
        RLC R13
        ;将被除数最高位依次移入临时字节中并与除数进行比较
        RCF ;必须予清C=0
        RLC R4
        RLC R3
        RLC R2
        RLC R12
        RLC R11
        RLC R10
               
               ;暂存R10,R11,R12值
        PUSH R12
               PUSH R11
               PUSH R10
        ;比较高位字节大小
        SUB R12,R9
        SBC R11,R8
        SBC R10,#0
        JR C,_POP
        ;如果被除数高位大于或等于除数,则置该位商为1
        OR R15,#01H
        ;比较成功,则平衡栈操作
        POP R5
        POP R5
        POP R5
        JR _SHF
_POP:
        ;比较不成功,则复原R10,R11值
        POP R10
        POP R11
        POP R12
_SHF:
        DEC R0
        JR NZ,_LOOP
        
        ;重新调入余数值到被除数中
        LD R2,R10
        LD R3,R11
        LD R4,R12
_BACK:
        POP R5
        POP R10
        POP R11
        POP R12
;---------------
.ENDM
;----------------------------------------------------------
;这是实现一个16位数与一个16位数相除的过程
;输入:
;被除数:
; R3(字节3),R4(低位字节)
;除数:
; R8(字节3),R9(低位字节)
;输入商值:
; R14(字节3),R15(低位字节)
;本例中被除数仅用到: R3,R4
;本例中除数仅用到: R8,R9
;本例中商值仅用到: R14,R15
;余数值退出时在原被除数中存放
;另外: R10,R11 被用作计算时被除数临时最高位两字节
; R0 被用作计算时计算时的循环计数器(8)
; R5 被用作暂存数据时平衡栈操作
;如果除数为0,则返回R0=0FFH以指示除数0错误,否则R0=0
;----------------------
;该宏于20140510验证OK
UDIV1616_MACRO: MACRO
        PUSH R11
        PUSH R10
        PUSH R5
  
        ;予清商数为0
        CLR R14
        CLR R15
        ;检测除数是否为0
        CP R8,#00H
        JR NE,_ST
        CP R9,#00H
        JR NE,_ST
        ;如果除数为零,则错误,返回R0=0FFH
        LD R0,#0FFH
        JR _BACK
_ST:
        ;予清被除数临时字节为0
        CLR R10
        CLR R11
        LD R0,#10H
_LOOP:
        ;予清商位为0
        RCF
        RLC R15
        RLC R14
        ;将被除数最高位依次移入临时字节中并与除数进行比较
        RCF ;必须予清C=0
        RLC R4
        RLC R3
        RLC R11
        RLC R10
               
               ;暂存R10值
               PUSH R10
               PUSH R11
               ;比较高位字节大小
               SUB R11,R9
        SBC R10,R8
        JR C,_POP
        ;如果被除数高位大于或等于除数,则置该位商为1
        OR R15,#01H
        ;比较成功,则平衡栈操作
        POP R5
        POP R5
        JR _SHF
_POP:
        ;比较不成功,则复原R10值
        POP R11
        POP R10
                                
_SHF:
        DEC R0
        JR NZ,_LOOP
        
        LD R3,R10
        LD R4,R11
_BACK:
        POP R5
        POP R10
        POP R11
;---------------------
.ENDM
;---------------------------------------------------------
;这是实现一个16位数与一个8位数相除的过程
;输入:
;被除数:
; R1(字节1),R2(字节2),R3(字节3),R4(低位字节)
;除数:
; R6(字节1),R7(字节2),R8(字节3),R9(低位字节)
;输入商值:
; R12(字节1),R13(字节2),R14(字节3),R15(低位字节)
;本例中被除数仅用到: R3,R4
;本例中除数仅用到: R9
;本例中商值仅用到: R14,R15
;余数值退出时在原被除数中存放
;;另外: R10被用作计算时被除数临时最高位字节;
; R0 被用作计算时计算时的循环计数器(8)
; R5 被用作暂存数据时平衡栈操作
;如果除数为0,则返回R0=0FFH以指示除数0错误,否则R0=0
;----------------------
;该宏已于20140510验证OK
UDIV1608_MACRO: MACRO
;------------------------
        PUSH R11
        PUSH R10
        PUSH R5
        
        ;予清商数为0
        CLR R14
        CLR R15
        ;检测除数是否为0
        CP R9,#00H
        JR NE,_ST
        ;如果除数为零,则错误,返回R0=0FFH
        LD R0,#0FFH
        JR _BACK
_ST:
        ;予清被除数临时字节为0
        CLR R10
        CLR R11
        LD R0,#10H
_LOOP:
        ;予清商位为0
        RCF
        RLC R15
        RLC R14
        ;将被除数最高位依次移入临时字节中并与除数进行比较
        RCF ;必须予清C=0
        RLC R4
        RLC R3
        RLC R11
        RLC R10
               
               ;暂存R10值
        PUSH R11
               PUSH R10
               ;比较高位字节大小
        SUB R11,R9
        SBC R10,#0
        JR C,_POP
        ;如果被除数高位大于或等于除数,则置该位商为1
        OR R15,#01H
        ;比较成功,则平衡栈操作
        POP R5
        POP R5
        JR _SHF
_POP:
        ;比较不成功,则复原R10值
        POP R10
        POP R11
_SHF:
        DEC R0
        JR NZ,_LOOP
        
        LD R3,R10
        LD R4,R11
_BACK:
        POP R5
        POP R10
        POP R11
;------------------
.ENDM
;------------------------------------------------------
;这是实现一个8位数与一个8位数相除的过程
;输入:
;被除数:
; R4(低位字节)
;除数:
; R9(低位字节)
;输入商值:
; R15(低位字节)
;本例中被除数仅用到: R4
;本例中除数仅用到: R9
;本例中商值仅用到: R15
;余数值退出时在原被除数中存放
;;另外: R10被用作计算时被除数临时最高位字节;
; R0 被用作计算时计算时的循环计数器(8)
; R5 被用作暂存数据时平衡栈操作
;如果除数为0,则返回R0=0FFH以指示除数0错误,否则R0=0
;----------------------
;该宏已于20140510验证OK
UDIV0808_MACRO: MACRO
        PUSH R10
        PUSH R5
        
        ;予清商数为0
        CLR R15
        ;检测除数是否为0
        CP R9,#00H
        JR NE,_ST
        ;如果除数为零,则错误,返回R0=0FFH
        LD R0,#0FFH
        JR _BACK
_ST:
         ;予清被除数临时字节为0
        CLR R10
        LD R0,#08H
_LOOP:
        ;予清商位为0
        RCF
        RLC R15
        ;将被除数最高位依次移入临时字节中并与除数进行比较
        RCF ;必须予清C=0
        RLC R4
        RLC R10
               
               ;暂存R10值
               PUSH R10
               ;比较高位字节大小
        SUB R10,R9
        JR C,_POP
        ;如果被除数高位大于或等于除数,则置该位商为1
        OR R15,#01H
        ;比较成功,则平衡栈操作
        POP R5
        JR _SHF
_POP:
        ;比较不成功,则复原R10值
        POP R10
                                
_SHF:
        DEC R0
        JR NZ,_LOOP
        
        LD R4,R10
_BACK:
        POP R5
        POP R10
;-------------------------
.ENDM
;-----------------------------------------------------------







相关备注:
 
三星单片机开发网首页