| Word alignment | ||||||||||||||
| 32-bit word: 4 bytes | ||||||||||||||
| Suppose we want to store the word 0123ABCDhex | ||||||||||||||
| Start at address 1000 | ||||||||||||||
| big-endian | data | 01 | 23 | AB | CD | |||||||||
| address | 1000 | 1001 | 1002 | 1003 | ||||||||||
| little-endian | data | CD | AB | 23 | 01 | |||||||||
| address | 1000 | 1001 | 1002 | 1003 | ||||||||||
| We say the word is stored at address 1000, meaning it's stored beginning at address 1000 | ||||||||||||||
| Could we store these same 4 bytes starting at address 1001, for example? | ||||||||||||||
| Yes, but the hardware for accessing the data in memory is simpler if the data is aligned | ||||||||||||||
| A word begins on a word boundary (address divisible by 4) | ||||||||||||||
| What's a good way to tell if an address is a word boundary? | ||||||||||||||
| If its address in binary ends in 00 | ||||||||||||||
| A halfword is aligned on an address divisible by 2 | ||||||||||||||
| What is the effect on high-level language? | ||||||||||||||
| Consider the structure | ||||||||||||||
| struct Foo { | ||||||||||||||
| char x ; // 1 byte | ||||||||||||||
| int y ; // 4 bytes | ||||||||||||||
| char z ; // 1 byte | ||||||||||||||
| int w ; // 4 bytes | ||||||||||||||
| } ; | ||||||||||||||
| What is the size of a variable of type struct Foo? | ||||||||||||||
| 1 + 4 + 1 + 4 = 10 bytes | ||||||||||||||
| Not necessarily! If the ints are aligned on word boundaries, there must be 3 bytes between | ||||||||||||||
| the chars and the ints. | ||||||||||||||
| This means that the size of the struct is 16 bytes, if alignment is required. | ||||||||||||||
| The extra bytes are called padding or holes. | ||||||||||||||
| This is the main reason struct variables can't be directly compared in C, | ||||||||||||||
| but they can be assigned directly. | ||||||||||||||
| The efficient way to compare would be to compare all bits in each struct, but | ||||||||||||||
| the pad bytes, if any, are undefined, and may be any value. | ||||||||||||||
| Why is assignment OK? | ||||||||||||||
| Try sizeof operator on this struct | ||||||||||||||
| Summary | ||||||||||||||
| address | binary address | |||||||||||||
| divisible by | ends in | |||||||||||||
| byte | 1 | anything | ||||||||||||
| halfword | 2 | 0 | ||||||||||||
| word | 4 | 00 | ||||||||||||
| doubleword | 8 | 000 | ||||||||||||