2.7.3. LDM 및 STM을 통한 블록 복사

Example 2.8은 한 번에 하나의 워드를 복사하여 소스 위치에서 대상으로 워드 세트를 복사하는 ARM 코드 루틴입니다. 이 예제는 주 예제 디렉토리인 install_directory\RVDS\Examplesword.s로 제공되어 있습니다. 이 예제를 어셈블, 링크 및 실행하는 방법에 대한 자세한 내용은 코드 예제를 참조하십시오.

Example 2.8. LDM 및 STM을 사용하지 않는 블록 복사

            AREA    Word, CODE, READONLY     ; name this block of code
num         EQU     20                       ; set number of words to be copied
            ENTRY                            ; mark the first instruction called
start
            LDR     r0, =src                 ; r0 = pointer to source block
            LDR     r1, =dst                 ; r1 = pointer to destination block
            MOV     r2, #num                 ; r2 = number of words to copy
wordcopy
            LDR     r3, [r0], #4             ; load a word from the source and
            STR     r3, [r1], #4             ; store it to the destination
            SUBS    r2, r2, #1               ; decrement the counter
            BNE     wordcopy                 ; ... copy more
stop
            MOV     r0, #0x18                ; angel_SWIreason_ReportException
            LDR     r1, =0x20026             ; ADP_Stopped_ApplicationExit
            SVC     #0x123456                ; ARM semihosting (formerly SWI) 
            AREA    BlockData, DATA, READWRITE
src         DCD     1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4
dst         DCD     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
            END

이 모듈은 가능한 한 많은 복사본을 만들기 위해 LDMSTM을 사용하여 보다 효율적으로 만들 수 있습니다. ARM에 있는 레지스터의 수를 고려하면 한 번에 여덟 개의 워드를 전송하는 것이 좋습니다. 복사할 블록에서 8워드 배수는 다음을 사용하여 찾을 수 있습니다 (r2 = 복사할 워드 수).

    MOVS   r3, r2, LSR #3    ; number of eight word multiples

이 값은 이터레이션당 여덟 개의 워드를 복사하는 루프를 통해 이터레이션 수를 제어하는 데 사용할 수 있습니다. 여덟 개 미만의 워드가 남아 있으면 r2가 손상되지 않았다는 가정 하에 다음을 사용하여 남은 워드 수를 찾을 수 있습니다.

    ANDS   r2, r2, #7

Example 2.9에서는 복사에 LDMSTM을 사용하도록 재작성된 블록 복사 모듈을 나열합니다.

Example 2.9. LDM 및 STM을 사용한 블록 복사

            AREA    Block, CODE, READONLY    ; name this block of code
num         EQU     20                       ; set number of words to be copied
            ENTRY                            ; mark the first instruction called
start
            LDR     r0, =src                 ; r0 = pointer to source block
            LDR     r1, =dst                 ; r1 = pointer to destination block
            MOV     r2, #num                 ; r2 = number of words to copy
            MOV     sp, #0x400               ; Set up stack pointer (sp) 
blockcopy
            MOVS    r3,r2, LSR #3            ; Number of eight word multiples
            BEQ     copywords                ; Less than eight words to move?
            PUSH    {r4-r11}                 ; Save some working registers
octcopy
            LDM     r0!, {r4-r11}            ; Load 8 words from the source
            STM     r1!, {r4-r11}            ; and put them at the destination
            SUBS    r3, r3, #1               ; Decrement the counter
            BNE     octcopy                  ; ... copy more
            POP     {r4-r11}                 ; Don't need these now - restore
                                             ; originals
copywords 
            ANDS    r2, r2, #7               ; Number of odd words to copy
            BEQ     stop                     ; No words left to copy?
wordcopy 
            LDR     r3, [r0], #4             ; Load a word from the source and
            STR     r3, [r1], #4             ; store it to the destination
            SUBS    r2, r2, #1               ; Decrement the counter
            BNE     wordcopy                 ; ... copy more
stop
            MOV     r0, #0x18                ; angel_SWIreason_ReportException
            LDR     r1, =0x20026             ; ADP_Stopped_ApplicationExit
            SVC     #0x123456                ; ARM semihosting (formerly SWI) 
            AREA    BlockData, DATA, READWRITE
src         DCD     1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4
dst         DCD     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
            END

Copyright © 2002-2008 ARM Limited. All rights reserved.ARM DUI 0204IK
Non-Confidential