Writing ARM and Thumb Assembly Language

2.10.5Forcing correct alignment

You are likely to have problems if you include some character variables in the data structure, as in Example 2-20. This is because a lot of words are misaligned.

Example 2-20

StartOfData

EQU

0x1000

 

EndOfData

EQU

0x2000

 

 

MAP

StartOfData

Char

FIELD

1

 

Char2

FIELD

1

 

Char3

FIELD

1

 

Integer

FIELD

4

; alignment = 3

Integer2

FIELD

4

 

String

FIELD

MaxStrLen

Array

FIELD

ArrayLen*8

BitMask

FIELD

4

 

EndOfUsedData

FIELD

0

 

 

ASSERT

EndOfUsedData <= EndOfData

You cannot use the ALIGN directive, because the ALIGN directive aligns the current location within memory. MAP and FIELD directives do not allocate any memory for the structures they define.

You could insert a dummy FIELD 1 after Char3 FIELD 1. However, this makes maintenance difficult if you change the number of character variables. You must recalculate the right amount of padding each time.

Example 2-21 on page 2-57 shows a better way of adjusting the padding. The example uses a FIELD directive with a 0 operand to label the end of the character data. A second FIELD directive inserts the correct amount of padding based on the value of the label. An :AND: operator is used to calculate the correct value.

The (-EndOfChars):AND:3expression calculates the correct amount of padding:

0 if EndOfChars is 0 mod 4;

3 if EndOfChars is 1 mod 4;

2 if EndOfChars is 2 mod 4;

1 if EndOfChars is 3 mod 4.

This automatically adjusts the amount of padding used whenever character variables are added or removed.

2-56

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

ARM DUI 0068B

Page 68
Image 68
ARM VERSION 1.2 manual Forcing correct alignment