Writing ARM and Thumb Assembly Language
ARM DUI 0068B Copyright © 2000, 2001 ARM Limited. All rights reserved. 2-63
2.10.7 Using two register-based structures
Sometimes you need to operate on two structures of the same type at the same time. For
example, if you want the equivalent of the pseudo-code:
newloc.x = oldloc.x + (value in r0);
newloc.y = oldloc.y + (value in r1);
newloc.z = oldloc.z + (value in r2);
The base register needs to point alternately to the
oldloc
structure and to the
newloc
one.
Repeatedly changing the base register would be inefficient. Instead, use a
non register-based map, and set up two pointers in two different registers as in
Example 2-26.
Example 2-26
MAP 0 ; Non-register based relative map used twice, for
Pointx FIELD 4 ; old and new data at oldloc and newloc
Pointy FIELD 4 ; oldloc and newloc are labels for
Pointz FIELD 4 ; memory allocated in other sections
; code
ADR r8,oldloc
ADR r9,newloc
LDR r3,[r8,Pointx] ; load from oldloc (r8)
ADD r3,r3,r0
STR r3,[r9,Pointx] ; store to newloc (r9)
LDR r3,[r8,Pointy]
ADD r3,r3,r1
STR r3,[r9,Pointy]
LDR r3,[r8,Pointz]
ADD r3,r3,r2
STR r3,[r9,Pointz]