Адресация оперативной памяти
В современных компьютерах единицей адресации является байт – ячейка памяти размером 8 бит. При этом и АЛУ, и шина данных могут иметь большую разрядность (хотя, конечно, эта разрядность всегда кратна байту – 8, 16, 32 или 64 бита). Разрядность АЛУ и шины данных может не совпадать: так, 18088 имел 16-разрядное АЛУ и 8-разрядную шину, MC68000 и 180386SX – 32-разрядное АЛУ и 16-разрядную шину. Что при этом понимается под "словом" – зависит от фантазии изготовителей процессора. Например, у вполне 32-разрядного VAX документация называет 16-битовую структуру словом, а 32-битовую – двойным или – длинным словом, хотя, обычно, длиной слова считается все-таки разрядность АЛУ.
При этом различные процессоры по-разному подходят к адресации слов.
Во-первых, некоторые процессоры (PDP-11, SPARC) запрещают обращения к словам, адрес которых не кратен размеру слова, и генерируют при попытках такого обращения исключительную ситуацию ошибки шины. Другие процессоры, например VAX и х86 такие обращения разрешают, но в документации есть честное предупреждение, что обращения к невыровненным словам будут минимум в два раза медленнее, чем к выровненным (рис. 2.4).
Рис. 2.4. Выровненные и невыровненные обращения к словам
Во-вторых, есть разногласия в том, как следует адресовать (или, как следует интерпретировать при арифметических операциях) байты одного слова – по какому адресу находятся старшие 8 битов, а по какому – младшие? У одних Процессоров (IBM/390, MC68000, SPARC) – старший байт располагается по меньшему адресу (big endian), у других (VAX, x86) – по большему (little etidian). Встречаются и процессоры со смешанным порядком байтов, когда, например, из двух байтов полуслова по меньшему адресу расположен младший, а из двух полуслов по меньшему адресу расположено старшее (рис. 2.5). Некоторые современные процессоры, например PowerPC, MIPS, SPARC V9 могут работать и с тем, и с другим порядком байтов, причем иногда даже в пределах одной программы.
Рис. 2.5. Порядок байтов в слове
Возможные различия в порядке байтов следует принимать во внимание при разработке форматов для передачи данных по сети или сохранения в файле. Кроме того, некоторые ошибки программирования (например, неявное преобразование указателя на байт в указатель на 16 – или 32-битовое целое число) относительно безобидны на машинах, у которых младший байт первый, и приводят к немедленным катастрофическим результатам на компьютерах, использующих меньший адрес для старшего байта.