ARM Instruction Reference

Saving from r15

In general, avoid saving from r15 if possible.

If you do save from r15, the value saved is the address of the current instruction, plus an implementation-defined constant. The constant is always the same for a particular processor.

If your assembled code might be used on different processors, you can find out what the constant is at runtime using code like the following:

SUB R1, PC, #4 ; R1 = address of following STR instruction

STR PC, [R0] ; Store address of STR instruction + offset,

LDR R0, [R0] ; then reload it

SUB R0, R0, R1 ; Calculate the offset as the difference

If your code is to be assembled for a particular processor, the value of the constant is available in armasm as {PCSTOREOFFSET}.

Architectures

These instructions are available in all versions of the ARM architecture.

In T variants of ARM architecture v5 and above, a load to r15 causes a change to executing Thumb instructions if bit[0] of the value loaded is set.

Examples

LDR

r8,[r10]

;

loads r8 from the address in r10.

 

LDRNE

r2,[r5,#960]!

;

(conditionally) loads r2 from a word

 

 

;

960

bytes above the address in r5, and

 

 

;

increments r5 by

960.

 

STR

r2,[r9,#consta-struc]

;

consta-struc

is an expression

evaluating

 

 

 

;

to a constant in the range 0-4095.

STRB

r0,[r3,-r8,ASR #2]

;

stores the least

significant byte

from

;r0 to a byte at an address equal to

;contents(r3) minus contents(r8)/4.

;r3 and r8 are not altered.

STR

r5,[r7],#-8

; stores

a word from r5 to the address

 

 

;

in r7,

and then decrements r7

by 8.

LDR

r0,localdata

;

loads a word located at label

localdata

ARM DUI 0068B

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

4-11

Page 121
Image 121
ARM VERSION 1.2 manual Saving from r15, Architectures