Writing ARM and Thumb Assembly Language

Example 2-13

 

AREA

Tblock, CODE, READONLY

;

Name this block of code

num

EQU

20

;

Set number of words to be copied

 

ENTRY

 

;

Mark first instruction to execute

header

 

 

;

The first instruction to call

 

MOV

sp, #0x400

;

Set up stack pointer (r13)

 

ADR

r0, start + 1

;

Processor starts in ARM state,

 

BX

r0

;

so small ARM code header used

 

 

 

;

to call Thumb main program

 

CODE16

 

;

Subsequent instructions are Thumb

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

blockcopy

 

 

 

 

LSR

r3,r2, #2

;

Number of four word multiples

 

BEQ

copywords

;

Less than four words to move?

 

PUSH

{r4-r7}

;

Save some working registers

quadcopy

 

 

 

 

 

LDMIA

r0!, {r4-r7}

;

Load 4 words from the source

 

STMIA

r1!, {r4-r7}

;

and put them at the destination

 

SUB

r3, #1

;

Decrement the counter

 

BNE

quadcopy

;

... copy more

 

POP

{r4-r7}

;

Don't need these now-restore originals

copywords

 

 

 

 

MOV

r3, #3

;

Bottom two bits represent number

 

AND

r2, r3

;

...of odd words left to copy

 

BEQ

stop

;

No words left to copy?

wordcopy

 

 

 

 

 

LDMIA

r0!, {r3}

;

load a word from the source and

 

STMIA

r1!, {r3}

;

store it to the destination

 

SUB

r2, #1

;

Decrement the counter

 

BNE

wordcopy

;

... copy more

stop

MOV

r0, #0x18

;

angel_SWIreason_ReportException

 

LDR

r1, =0x20026

;

ADP_Stopped_ApplicationExit

 

SWI

0xAB

;

Thumb 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-47

Page 59
Image 59
ARM VERSION 1.2 manual Lsr