Память. Все компьютеры имеют некоторый объем быстрой памяти с произвольным доступом, такую память, бывало, называли «сердцем» компьютера, поскольку запоминали и сохраняли данные малюсенькие магнитные сердечники - по одному на каждый запоминаемый бит. В большой микроЭВМ объем ОЗУ может достигать 10 Мбайт и более, хотя типичным значением является 1 Мбайт, а в микроконтроллерах объем ОЗУ может составлять всего 16 Кбайт. (Когда память измеряют в единицах К, это означает не 1000 байт, а 1024 или 210 байт; таким образом, 16 Кбайт на самом деле составляют 16 384 байт. Для обозначения 1000 мы употребляем строчную букву к.) Для того чтобы записать в такую память какой-либо код или считать его, обычно требуется около 100 не. Память с произвольным доступом почти всегда «разрушаема», это означает, что, когда электропитание отключается, информация улетучится (возможно, эту характеристику следовало бы назвать «забывчивостью»). Поэтому все компьютеры в своем составе имеют и неразрушаемую память, обычно доступную только для чтения (ПЗУ) и предназначенную для того, чтобы «завести»[2] машину, находящуюся до включения питания в состоянии полной амнезии.
В дополнительное ПЗУ часто записывают системные и графические процедуры, а также другие программы, которые должны быть доступны в любой момент.
Для того чтобы считать из памяти или сохранить в памяти ту или иную информацию, ЦП «адресует» то слово (памяти), какое пожелает. Большинство компьютеров адресует память побайтно, начиная с нулевого байта и последовательно перебирая байты вплоть до последнего в памяти. Поскольку машинное слово большинства компьютеров составляет несколько байт, обычно за один раз вы заносите в память или извлекаете из нее группу байт; обычно необременительно иметь шину данных с разрядностью в несколько байт. Например, микроЭВМ, которые построены на МП 80386 или 68020, имеют 32-разрядную шину данных (что равно 4 байт), так что 32-разрядное слово может быть записано в память или считано из нее за один цикл выборки. Для того чтобы указать длину последовательности передаваемых байт, используют управляющие сигналы, причем даже для «солидных» шин вам на это потребуется всего 1–2 байт.
В компьютере с большим количеством сегментов памяти для указания произвольного адреса памяти необходимо 3–4 байт. Поскольку большинство адресов памяти в реальной программе обычно близко, все компьютеры поддерживают упрощенные модели адресации: «относительная» адресация определяет адрес по удалению его от текущей команды в памяти; «косвенная» адресация использует содержимое регистра ЦП для указания ячейки в памяти; «страничная» адресация использует укороченные адреса для указания на заданную ячейку памяти в пределах малого диапазона (страницы); «прямая» или «абсолютная» адресация использует несколько следующих за командой байт для указания адреса. Современные ЦП венчают этот краткий список «индексной», «автоинкрементной» и другими полезными способами адресации, которых мы коснемся в следующей главе.
Во время выполнения программы в памяти находятся как собственно программа, так и данные. Центральный процессор извлекает команды из памяти, выясняет, что они означают и поступает соответственно, при этом часто требуется сохранить данные где-нибудь в памяти. Обычно неспециализированные универсальные компьютеры хранят программы и данные в одной и той же памяти, причем компьютер на самом деле не отличает одних от других. Если программа пойдет не туда и начнет «исполнять» данные, могут начаться забавные вещи!
Поскольку компьютерные программы большую часть своей жизни проводят в циклах, состоящих из сравнительно коротких последовательностей команд, вы можете увеличить производительность машины, используя малую по объему, но быструю