Базирование адресов
Для дальнейшего уменьшения объёма программы современные ЭВМ используют базирование адресов. Изучение этого понятия проведём на следующем примере. Пусть в программе на одноадресной машине необходимо реализовать арифметический оператор присваивания X:=(A+B)2. Ниже приведена эта часть программы с соответствующими комментариями (напомним, что S – это регистр сумматора одноадресной ЭВМ):
...
СЧ A; S:=A
СЛ B; S:=A+B
ЗП R; R:=A+B – запись в рабочую переменную
УМ R; S:=(A+B)2
ЗП X; X:=(A+B)2
...
Так как в нашем примере одноадресная ЭВМ имеет 224 (примерно 16 миллионов) ячеек памяти, то будем считать, что наш фрагмент программы располагается где-то примерно в средине памяти. Пусть, например, наши переменные располагаются соответственно в следующих ячейках памяти:
A – в ячейке с адресом 10 000 000
B – в ячейке с адресом 10 000 001
X – в ячейке с адресом 10 000 002
R – в ячейке с адресом 10 000 003
Тогда приведённый выше фрагмент программы будут выглядеть следующим образом:
...
СЧ 10 000 000; S:=A
СЛ 10 000 001; S:=A+B
ЗП 10 000 003; R:=A+B
УМ 10 000 003; S:=(A+B)2
ЗП 10 000 002; X:=(A+B)2
...
Из этого примера видно, что большинство адресов в нашей программе имеют вид B+D, где число B назовём базовым адресом программы или просто базой (в нашем случае B=10 000 000), а D – смещением адреса относительно этой базы. Здесь налицо существенная избыточность информации. Очевидно, что в каждой команде можно указывать только короткое смещение D, а базу хранить отдельно (обычно на каком-то специальном базовом регистре центрального процессора). Исходя из этих соображений, предусмотрим в машинном языке команду загрузки базы (длина этой команды 4 байта):
ЗГБ | A1 |
8 бит | 24 бита |
Тогда наш фрагмент программы будет иметь такой вид:
...
ЗГБ 10 000 000
...
СЧ 000; S:=A
СЛ 001; S:=A+B
ЗП 003; R:=A+B
УМ 003; S:=(A+B)2
ЗП 002; X:=(A+B)2
...
Теперь, однако, при выполнении каждого обращения за операндом в основную память, центральный процессор должен вычислять значение адреса этого операнда адреса по формуле A=B+D. Это вычисление производится в устройстве управления и, естественно, усложняет его. Например, адрес переменной A=10000001=B+D=107+1.
Осталось выбрать длину смещения D. Вернёмся к рассмотрению дробноадресной ЭВМ, для которой реализовано базирование адресов. Например, пусть под запись смещения выделим в команде поле длиной в 12 бит. Будем, как и раньше, обозначать операнд в памяти A1 или A2, но помним, что теперь это только смешение относительно базы. Тогда все команды, которые обращаются за операндом в основную память, будут в нашей дробноадресной ЭВМ более короткими:
КОП | R1 | A2 |
8 бит | 4 бита | 12 бит |
Схема выполнения такой команды для формата регистр-память:
<R1> := <R1> Ä <B+A2>
или для формата память-регистр:
<B+A2> := <B+A2> Ä <R1>
Область, в которой находятся вычисляемые относительно базы ячейки основной памяти, обычно называется сегментом памяти – это сплошной участок памяти, начало которого задаётся в некотором регистре, называемом базовым, или сегментным. Будем далее для определённости называть такие регистры сегментными, а сам приём – сегментированием памяти.
Сегментирование позволяет уменьшить объём памяти для хранения программ, но оно имеет и один существенный недостаток: теперь каждая команда может обращаться не к любой ячейки оперативной памяти, а только к тем из них, до которых "дотягивается" смещение. В нашем примере каждая команда может обращаться к диапазону адресов от значения сегментного регистра B до B+212-1. Для доступа к другим ячейкам памяти необходимо записать в сегментный регистр новое значение (как говорят, перезагрузить сегментный регистр). Несмотря на указанный недостаток, практически все современные ЭВМ производят сегментирование памяти. Заметим также, что этот недостаток в большинстве архитектур современных ЭВМ исправляется путём реализации переменной длины смещения (например, разрешается смешение в 1, 2 или 4 байта), что, однако ещё более увеличивает набор команд и усложняет центральный процессор.
Итак, для осуществления доступа к памяти ЭВМ необходимо, чтобы ячейка, к которой осуществляется доступ, находилась в сегменте, на начало которого указывает сегментный регистр. Современные ЭВМ обеспечивают одновременную работу с несколькими сегментами памяти и, соответственно, имеют несколько сегментных регистров.
В некоторых архитектурах регистры центрального процессора являются универсальными, т.е. каждый из них может быть использован как сегментный или для выполнения любых операций над данными. Сложность центрального процессора при этом существенно повышается, так что во многих архитектурах используются специализированные регистры, т.е. определённые регистры являются сегментными, на других могут производиться операции и т.д.
Дата добавления: 2015-10-05; просмотров: 1593;