Writing ARM and Thumb Assembly Language

Example 2-12

 

AREA

Block, CODE, READONLY

;

name this block of code

num

EQU

20

;

set number of words to be copied

 

ENTRY

 

;

mark the first instruction to call

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 (r13)

blockcopy

MOVS

r3,r2, LSR #3

;

Number of eight word multiples

 

BEQ

copywords

;

Less than eight words to move?

 

STMFD

sp!, {r4-r11}

;

Save some working registers

octcopy

LDMIA

r0!, {r4-r11}

;

Load 8 words from the source

 

STMIA

r1!, {r4-r11}

;

and put them at the destination

 

SUBS

r3, r3, #1

;

Decrement the counter

 

BNE

octcopy

;

... copy more

 

LDMFD

sp!, {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

 

SWI

0x123456

;

ARM semihosting 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

 

 

 

 

 

 

 

 

ARM DUI 0068B

Copyright © 2000, 2001 ARM Limited. All rights reserved.

2-45

Page 57
Image 57
ARM VERSION 1.2 manual Movs