| |||
| Home > Writing ARM and Thumb Assembly Language > Describing data structures with MAP and FIELD directives > 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]