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

📄 memcopy.s

📁 在STR912上实现的uip
💻 S
字号:
        AREA    |.text|, CODE, READONLY
        CODE32

        EXPORT  MEMCOPY_L2S_BY4
        EXPORT  MEMCOPY_S2L_BY4
        EXPORT  MEMCOPY_L2L_BY4



MEMCOPY_L2S_BY4
        STMFD       SP!, {R4-R10}

d_main
        LDMIA       R1!,{R3,R5,R7,R9}
        MOV         R4, R3, LSR #16
        MOV         R6, R5, LSR #16
        MOV         R8, R7, LSR #16
        MOV         R10, R9, LSR #16
        STRH        R3, [R0], #2
        STRH        R4, [R0], #2
        STRH        R5, [R0], #2
        STRH        R6, [R0], #2
        STRH        R7, [R0], #2
        STRH        R8, [R0], #2
        STRH        R9, [R0], #2
        STRH        R10, [R0], #2
        SUB         R2, R2, #16
        CMP         R2,#16            ;if ( remaining_bytes >= 16)
        BHS         d_main            ;keep on looping
                                      ;else switch(remaining_bytes) d_swit d_0123
        CMP         R2,#3             ;remaining <= 3 bytes?
        BLS         d_switch

d_4567

        LDR         R3, [R1], #4
        MOV         R4, R3, LSR #16
        STRH        R3, [R0], #2
        STRH        R4, [R0], #2
        SUB         R2, R2, #4
        CMP         R2,#3           ; remaining <= 3 bytes?
        BLS         d_switch        ;    switch(remaining_bytes 0,1,2,3)

d_891011

        LDR         R3, [R1], #4
        MOV         R4, R3, LSR #16
        STRH        R3, [R0], #2
        STRH        R4, [R0], #2
        SUB         R2, R2, #4
        CMP         R2,#3         ; remaining <= 3 bytes?
        BLS         d_switch      ;    switch(remaining_bytes 0,1,2,3)

d_12131415

        LDR         R3, [R1], #4
        MOV         R4, R3, LSR #16
        STRH        R3, [R0], #2
        STRH        R4, [R0], #2
        SUB         R2, R2, #4

d_switch

       LDR PC,[PC, R2, LSL#2]
       B       d_END
       DCD     d_END
       DCD     d_1B
       DCD     d_2B
       DCD     d_3B

d_1B

        LDRB        R3, [R1]
        STRB        R3, [R0]
        B           d_END

d_2B

        LDRH        R3, [R1]
        STRH        R3, [R0]
        B           d_END

d_3B
        LDRH        R3, [R1], #2
        LDRB        R4, [R1]
        STRH        R3, [R0], #2
        STRB        R4, [R0]

d_END

        LDMFD       SP!, {R4-R10}
        BX          LR


MEMCOPY_L2L_BY4
        STMFD       SP!, {R4-R10}

e_main
        LDMIA       R1!,{R3,R5,R7,R9}
        STMIA       R0!,{R3,R5,R7,R9}
        SUB         R2, R2, #16
        CMP         R2,#16          ; if ( remaining_bytes >= 16)
        BHS         e_main          ; keep on looping
                                    ; else switch(remaining_bytes)
e_swit
e_0123
        CMP         R2,#3           ; remaining <= 3 bytes?
        BLS         e_switch
e_4567

        LDR         R3, [R1], #4
        STR         R3, [R0], #4
        SUB         R2, R2, #4
        CMP         R2,#3             ; remaining <= 3 bytes?
        BLS         e_switch          ; switch(remaining_bytes 0,1,2,3)
e_891011
        LDR         R3, [R1], #4
        STR         R3, [R0], #4
        SUB         R2, R2, #4
        CMP         R2,#3              ; remaining <= 3 bytes?
        BLS         e_switch           ;    switch(remaining_bytes 0,1,2,3)
e_12131415
        LDR         R3, [R1], #4
        STR         R3, [R0], #4
        SUB         R2, R2, #4

e_switch
        LDR PC,[PC, R2, LSL#2]
        B e_END
       DCW   e_END
       DCW   e_1B
       DCW   e_2B
       DCW   e_3B

e_1B
        LDRB        R3, [R1]
        STRB        R3, [R0]
        B           e_END
e_2B
        LDRH        R3, [R1]
        STRH        R3, [R0]
        B           e_END
e_3B
        LDRH        R3, [R1], #2
        LDRB        R4, [R1]
        STRH        R3, [R0], #2
        STRB        R4, [R0]
        B           e_END
e_END
        LDMFD       SP!, {R4-R10}
        BX LR

MEMCOPY_S2L_BY4
        STMFD       SP!, {R4-R10}

f_main
        LDRH        R3, [R1], #2
        LDRH        R4, [R1], #2
        LDRH        R5, [R1], #2
        LDRH        R6, [R1], #2
        LDRH        R7, [R1], #2
        LDRH        R8, [R1], #2
        LDRH        R9, [R1], #2
        LDRH        R10, [R1], #2
        ORR         R3,R3,R4,  LSL#16
        ORR         R5,R5,R6,  LSL#16
        ORR         R7,R7,R8,  LSL#16
        ORR         R9,R9,R10, LSL#16
        STMIA       R0!,{R3,R5,R7,R9}
        SUB         R2, R2, #16
        CMP         R2,#16      ; if ( remaining_bytes >= 16)
        BHS         f_main      ; keep on looping
                                ; else switch(remaining_bytes)
f_swit
f_0123
        CMP         R2,#3        ; remaining <= 3 bytes?
        BLS         f_switch
f_4567
        LDRH        R3, [R1], #2
        LDRH        R4, [R1], #2
        ORR         R3,R3,R4, LSL#16
        STR         R3, [R0], #4
        SUB         R2, R2, #4
        CMP         R2,#3        ; remaining <= 3 bytes?
        BLS         f_switch     ;    switch(remaining_bytes 0,1,2,3)
f_891011
        LDRH        R3, [R1], #2
        LDRH        R4, [R1], #2
        ORR         R3,R3,R4, LSL#16
        STR         R3, [R0], #4
        SUB         R2, R2, #4
        CMP         R2,#3         ; remaining <= 3 bytes?
        BLS         f_switch      ;    switch(remaining_bytes 0,1,2,3)
f_12131415
        LDRH        R3, [R1], #2
        LDRH        R4, [R1], #2
        ORR         R3,R3,R4, LSL#16
        STR         R3, [R0], #4
        SUB         R2, R2, #4

f_switch
        LDR PC,[PC, R2, LSL#2]
        B f_END
       DCW   f_END
       DCW   f_1B
       DCW   f_2B
       DCW   f_3B

f_1B
        LDRB        R3, [R1]
        STRB        R3, [R0]
        B           f_END
f_2B
        LDRH        R3, [R1]
        STRH        R3, [R0]
        B           f_END
f_3B
        LDRH        R3, [R1], #2
        LDRB        R4, [R1]
        STRH        R3, [R0], #2
        STRB        R4, [R0]
        B           f_END
f_END
        LDMFD       SP!, {R4-R10}
        BX LR

         END



⌨️ 快捷键说明

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