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

📄 div.s

📁 基于ARM7的LPC21XX系列的部分汇编源码
💻 S
字号:
;/****************************************Copyright (c)****************************************
;** 文件名:DIV.S
;** 描述:替换ADS1.2的整数除法库。当用户程序使用了除法时,把这个文件与用户程序一齐编译即可
;*******************************************************************************************/

;引入的外部标号在这声明
    
;给外部使用的标号在这声明
    EXPORT  __rt_udiv
    EXPORT  __rt_sdiv

;段声明
    IF {CONFIG} = 16
    CODE16
    ELSE   
    CODE32
    ENDIF

    AREA    Init,CODE,READONLY

;/*********************************************************************************************************
;** 函数名称: Myclz
;** 功能描述: 仿真clz指令
;** 输 入: R0  : 需要计算前导零的数
;** 输 出: R0  :计算结果
;** 全局变量:
;** 调用模块: 
;**
;** 作 者: 陈明计
;** 日 期: 2003年6月30日
;**-------------------------------------------------------------------------------------------------------
;** 修改人: 
;** 日 期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
Myclz
        MOV     R1, #32
MyclzSTR
        CMP     R0, #0
        BMI     MyclzRET
        ADD     R0, R0, R0

    IF {CONFIG} = 16
        SUB     R1, R1, #1
    ELSE   
        SUBS    R1, R1, #1
    ENDIF

        BNE     MyclzSTR
MyclzRET

    IF {CONFIG} = 16
        MOV     R0, #32 
        SUB     R0, R0, R1
    ELSE   
        RSB     R0, R1, #32
    ENDIF

        MOV     PC, LR

;/*********************************************************************************************************
;** 函数名称: __rt_sdiv
;** 功能描述: 无符号数除以无符号数
;** 输 入: R0  : 除数
;           R1  :被除数     
;** 输 出: R0  :R1 / R0
;           R1  : R1 % R0
;** 全局变量:
;** 调用模块: 
;**
;** 作 者: 陈明计
;** 日 期: 2003年6月30日
;**-------------------------------------------------------------------------------------------------------
;** 修改人: 
;** 日 期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/


__rt_udiv
        CMP     R0, #0
        
        IMPORT  __rt_div0
        
    IF {CONFIG} = 16
        BNE     __rt_udiv_1
        LDR     R0, =__rt_div0
        BX      R0
    ELSE
        BEQ      __rt_div0
    ENDIF

__rt_udiv_1
        CMP     R0, R1
        
    IF {CONFIG} = 16
        BLS     __rt_udiv_2
        MOV     R0, #0
        MOV     PC, LR
__rt_udiv_2
        PUSH    {R4-R7, LR}
    ELSE   
        MOVHI   R0, #0
        MOVHI   PC, LR
        STMFD   SP!, {R4-R7, LR}
    ENDIF

        MOV     R4, R1
        MOV     R5, R0
        BL      Myclz
        MOV     R7, R0
        MOV     R0, R4
        BL      Myclz
        SUB     R7, R7, R0

    IF {CONFIG} = 16
        LSL     R5, R7
    ELSE   
        MOV     R5, R5, LSL R7
    ENDIF

        MOV     R0, #0
__rt_udiv_3
        ADD     R0, R0, R0

    IF {CONFIG} = 16
        SUB     R1, R4, R5
        BLO     __rt_udiv_4
        MOV     R4, R1
        ADD     R0, R0, #1
__rt_udiv_4
        LSR     R5, R5, #1
        SUB     R7, R7, #1
    ELSE   
        SUBS    R1, R4, R5
        MOVHS   R4, R1
        ADDHS   R0, R0, #1
        MOV     R5, R5 ,LSR #1
        SUBS    R7, R7, #1
    ENDIF

        BCS     __rt_udiv_3
        MOV     R1, R4

    IF {CONFIG} = 16
        POP     {R4-R7, PC}
    ELSE   
        LDMFD   SP!, {R4-R7, PC}
    ENDIF

;/*********************************************************************************************************
;** 函数名称: __rt_sdiv
;** 功能描述: 有符号数除以有符号数
;** 输 入: R0  : 除数
;           R1  :被除数     
;** 输 出: R0  :R1 / R0
;           R1  : R1 % R0
;** 全局变量:
;** 调用模块: 
;**
;** 作 者: 陈明计
;** 日 期: 2003年6月30日
;**-------------------------------------------------------------------------------------------------------
;** 修改人: 
;** 日 期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/

__rt_sdiv
        MOV     R2, #0
        CMP     R0, #0

    IF {CONFIG} = 16
        BGE     __rt_sdiv_1
        SUB     R0, R2, R0
        ADD     R2, R2, #1
    ELSE
        ADDLT   R2, R2, #1
        RSBLT   R0, R0, #0
    ENDIF
                  
__rt_sdiv_1
        CMP     R1, #0

    IF {CONFIG} = 16
        BGE     __rt_sdiv_2
        MOV     R3, #0
        SUB     R1, R3, R1
        ADD     R2, R2, #2
    ELSE   
        ADDLT   R2, R2, #2
        RSBLT   R1, R1, #0
    ENDIF
        
__rt_sdiv_2
        CMP     R2, #0
        BEQ     __rt_udiv

    IF {CONFIG} = 16
        PUSH    {R2, LR}
        BL      __rt_udiv
        POP     {R2}
        MOV     R3, #0
    ELSE   
        STMFD   SP!, {R2, LR}
        BL      __rt_udiv
        LDMFD   SP!, {R2}
    ENDIF
        
        CMP     R2, #2

    IF {CONFIG} = 16
        BLE     __rt_sdiv_3
        BGE     __rt_sdiv_4
        POP     {PC}
    ELSE   
        RSBLE   R0, R0, #0
        RSBGE   R1, R1, #0
        LDMFD   SP!, {PC}
    ENDIF

__rt_sdiv_3

    IF {CONFIG} = 16
        SUB     R0, R3, R0
        CMP     R2, #2
        BGE    __rt_sdiv_4
        POP     {PC}
    ENDIF

__rt_sdiv_4

    IF {CONFIG} = 16
        SUB     R1, R3, R1
        POP     {PC}
    ENDIF

    END
;/*********************************************************************************************************
;**                            End Of File
;********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -