实现一个无符号24位数与一个无符号16位数相除的宏
(SAM88RCRI指令集)
文章来源: 本站原创   更新时间: 修改日期
;点击这里直接下载该示例源码
;---------------------------------------------------------
;这是实现一个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错误
;----------------------
UDIV2416_MACRO: MACRO
;-------------------------
        PUSH R11
        PUSH R10
        PUSH R5
        PUSH R0
        
        ;予清被除数临时字节为0
        CLR R10
        CLR R11
        ;予清商数为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:
        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
               
               ;暂存R10,R11值
               PUSH R11
               PUSH R10
                ;比较高位字节大小
        SUB R11,R9
        SBC R10,R8
        JR C,_POP
        ;如果被除数高位大于或等于除数,则置该位商为1
        OR R15,#01H
        ;比较成功,则平衡栈操作
        POP R5
        POP R5
        JR _SHF
_POP:
        ;比较不成功,则复原R10,R11值
        POP R10
        POP R11
_SHF:
        DEC R0
        JR NZ,_LOOP
        
        LD R3,R10
        LD R4,R11
_BACK:
        POP R0
        POP R5
        POP R10
        POP R11
;---------------
.ENDM
;----------------------------------------------------------
相关备注:
 
三星单片机开发网首页