4.2. Память и адреса
Числовые и символьные операнды, равно как и команды, хранятся в памяти компьютера. Память состоит из многих миллионов ячеек, в каждой из которых содержится один бит информации, имеющий значение 0 или 1. Поскольку один бит способен представить очень маленькое количество информации, биты редко обрабатываются поодиночке. Как правило, их обрабатывают группами фиксированного размера. Для этого память организуется таким образом, что группы по n бит могут записываться и считываться за одну базовую операцию. Группа из n бит называется словом информации, а значение n — длиной слова. Схематически память компьютера можно представить в виде набора слов (рис. 4.6).
Длина слова современных компьютеров составляет от 16 до 64 бит. Если длина слова компьютера равна 32 битам, в одном слове может храниться 32-разрядное число в системе дополнения до двух или четыре символа ASCII, занимающих по 8 бит (рис. 4.7). Восемь идущих подряд битов называются байтом. Для представления машинной команды требуется одно или несколько слов. О кодировании машинных команд мы поговорим далее в этой главе, после того как обсудим команды на уровне языка ассемблера.
Рис. 4.6. Слова памяти
Рис. 4.7. Примеры закодированной информации в 32-разрядном слове:
целое число со знаком (а); четыре символа (б)
Для доступа к памяти с целью записи или чтения отдельных элементов информации, будь то слова или байты, необходимы имена или адреса, определяющие их расположение в памяти. В качестве адресов традиционно используются числа из диапазона от 0 до 2k-1 со значением k, достаточным для адресации всей памяти компьютера. Все 2k адресов составляют адресное пространство компьютера. Следовательно, память состоит из 2k адресуемых элементов. Например, использование 24-разрядных адресов позволяет адресовать 224 (16777216) элементов памяти. Обычно это количество адресуемых элементов обозначается как 16 M (16 мега), где 1 М - 220 (1048576). 32-разрядным адресам соответствует адресное пространство из 232, или 4 Г (4 гига), элементов, где 1 Г - 230. Кроме того, часто используются обозначения К (кило), соответствующее 210 (1024), и Т (тера), соответствующее 240.
Байтовая адресация
Итак, у нас есть три основные единицы информации: бит, байт и слово. Байт всегда равен 8 битам, а длина слова обычно колеблется от 16 до 64 бит. Отдельные биты, как правило, не адресуются. Чаще всего адреса назначаются байтам памяти. Именно так адресуется память большинства современных компьютеров, и именно этот способ адресации мы будем использовать в этой книге. Память, в которой каждый байт имеет отдельный адрес, называется памятью с байтовой адресацией. Последовательные байты имеют адреса 0, 1, 2 и т. д. Таким образом, при использовании слов длиной 32 бита последовательные слова имеют адреса 0,4,8,..., и каждое слово состоит из 4 байт.
Прямой и обратный порядок байтов
Существует два способа адресации байтов в словах, а именно в прямом и обратном порядке (рис. 4.8). Обратным порядком байтов (big-endian) называется система адресации, при которой байты адресуются слева направо, так что самый старший байт слова (расположенный с левого края) имеет наименьший адрес. Прямым порядком байтов (little-endian) называется противоположная система адресации, при которой байты адресуются справа налево, так что наименьший адрес имеет самый младший байт слова (расположенный с правого края). Слова «старший» и «младший» определяют вес бита, то есть степень двойки, соответствующей данному биту, когда слово представляет число. В машинах для коммерческих расчетов используются обе системы адресации. В обеих этих системах адреса байтов 0,4, 8 и т. д. применяются в качестве адресов последовательных слов памяти в операциях чтения и записи слов.
Рис. 4.8. Адресация байтов и слов: обратный порядок байтов (а);
прямой порядок байтов (б)
В компьютерах, использующих процессоры Intel, все данные хранятся так, что младший байт находится по младшему адресу, так что слова записываются задом наперед, то есть сначала (по младшему адресу) записывают последний (младший) байт, а потом (по старшему адресу) записывают первый (старший) байт. Если из программы всегда обращаться к слову как к слову, а к двойному слову как к двойному слову, это не оказывает никакого влияния. Но если вы хотите прочитать первый (старший) байт из слова в памяти, придется увеличить адрес на 1. Двойные и учетверенные слова записываются так же — от младшего байта к старшему.
Наряду с порядком байтов в слове важно также определить порядок битов в байте. Типичный способ расположения битов показан на рис. 4.7, а. Это наиболее естественный порядок битов для кодирования числовых данных, непосредственно соответствующий их разрядам. Этот же порядок использован на рисунке при обозначении битов: b7,b6, …,b0 (слева направо). Однако существуют компьютеры, для которых характерен обратный порядок битов.
Расположение слов в памяти
В случае 32-разрядных слов их естественные границы располагаются по адресам 0, 4, 8 и т. д. (рис. 4.8). При этом мы говорим, что слова выровнены по адресам в памяти. Если говорить, в общем, слова считаются выровненными в памяти в том случае, если адрес начала каждого слова кратен количеству байтов в нем. По практическим причинам, связанным с манипулированием двоично-кодированными адресами, количество байтов в слове обычно является степенью двойки. Поэтому, если длина слова равна 16 (2 байтам), выровненные слова начинаются по байтовым адресам 0, 2, 4,..., а если она равна 64 (23 байтам), то выровненные слова начинаются по байтовым адресам 0, 8, 16, ... .
Не существует причины, по которой слова не могли бы начинаться с произвольных адресов. Такие слова называются невыровненными. Как правило, слова выравниваются по адресам памяти, но в некоторых компьютерах это не так.
Доступ к числам, символам и символьным строкам
Обычно число занимает целое слово. Поэтому, для того чтобы обратиться к нему в памяти, нужно указать адрес слова, по которому оно, это число, хранится. Точно так же доступ к отдельно хранящемуся в памяти символу осуществляется по адресу его байта.
Во многих приложениях необходимо обрабатывать строки символов переменной длины. Для доступа к такой строке нужно указать адрес байта, в котором хранится ее первый символ. Последовательные символы строки содержатся в последовательных байтах. Существует два способа определения длины строки. Первый из них заключается в использовании специального управляющего символа, обозначающего конец строки и являющегося ее последним символом. Второй способ состоит в использовании отдельного слова памяти или регистра процессора, содержащего число, которое определяет длину строки в байтах.