logo
КС-ZAO / Лекции ЦЭВМруский вариант11

§14.1 Способы адресации мп

В МП используется пять различных способов адресации. Рассмотрим каждый из них.

Прямая адресация. При этом способе адресации младшая половина шестнадцатиразрядного адреса содержится во втором байте трехбайтовой команды, а старшая половина в ее третьем байте. Первый байт используется для размещения кода операции.

Например, на рис. 14.1 показана команда прямой загрузки аккумулятора содержимым ячейки памяти, расположенной по шестнадцатеричному адресу 001А.6.

Рис. 14.1. Пример выполнения команды прямой адресации

После выполнения команды копия содержимого ячейки по указанному адресу передается в аккумулятор. При этом содержимое ячейки памяти остается неизменным. Это позволяет программе многократно обращаться за данными к одной и той же ячейке памяти.

Являясь наиболее естественной и простой для понимания, прямая адресация имеет существенный недостаток: длина команд с прямой адресацией содержит три байта; поэтому для своего выполнения команда требует три машинных цикла, т. е. больших затрат времени.

Косвенная адресация. При необходимости многократного обращения к какой-либо ячейке памяти ее адрес удобнее хранить не в самой команде, а в одном из внутренних регистров МП. Тогда в команде необходимо указать лишь номер регистра, в котором хранится адрес интересующей ячейки памяти. Такая адресация называется косвенной. Для хранения шестнадцатиразрядного адреса однобайтовые регистры объединяются в регистровые пары, которые именуются по названию первого регистра пары.

Номера регистровых пар кодируются следующим образом:

ВС—,00 HL—10 DE—01 SP—11

В первом регистре пары всегда хранится старший байт адреса, а во втором младший байт.

Естественно, номер регистровой пары, в которой хранится адрес, содержит всего лишь две двоичных цифры и легко размещается в однобайтовой команде вместе с кодом операции.

Однобайтовые команды с косвенной адресацией выполняются всего лишь за один машинный цикл и требуют меньших затрат времени, чем команды прямой адресации.

На рис. 14.2 в качестве примера показано выполнение команды косвенной загрузки аккумулятора содержимым ячейки, адрес которой OOlA хранится в регистровой паре DE. Команда косвенной загрузки аккумулятора однобайтная и, кроме кода операции, содержит номер 01 регистровой пары DE. Старшая часть адреса ячейки памяти (00ig) хранится в регистре D, а младшая часть (lA1E)— в регистре Е. Содержимое OOl A1 регистровой пары передается в регистр адреса МП, в результате чего происходит обращение к ячейке памяти по адресу 001А,о. Содержимое ячейки памяти по указанному адресу копируется в аккумулятор, в котором после выполнения команды загрузки окажется двоичное число 11010111. Поскольку при обращении к ячейке памяти ее содержимое не разрушается, оно может использоваться многократно при выполнении других команд.

Рис. 14.2. Пример выполнения команды косвенной адресации

Непосредственная адресация. В командах с непосредственной адресацией данные операнда находятся непосредственно во втором или втором и третьем байтах команды. В первом байте, как обычно, размещается код операции. При использовании такого способа не требуется указание какого-либо адреса памяти. Эти данные берутся непосредственно из команды, куда они заносятся программистом при программировании. В процессе выполнения программы эти данные остаются неизменными, так как вместе с командами размещаются в ПЗУ. Этими данными обычно являются некоторые константы, заранее известные программисту.

Рис. 14.3. Пример выполнения команды непосредственной адресации

В качестве примера рассмотрим показанное на рис. 14.3 выполнение команды непосредственной загрузки аккумулятора данными 11010111, хранящимися во втором байте команды. После выполнения указанной команды данные скопируются в аккумулятор. При каждом повторном обращении к этой команде в аккумулятор будут записываться одни и те же данные.

Если обрабатываемые данные размещены во внутренних регистрах МП, то обратиться к ним можно, указав двоичные коды регистров непосредственно в первом байте команды. Такая адресация называется регистровой. Кодирование регистров производится трехразрядными двоичными или одноразрядными восьмеричными кодами:

Рис.14.4 . Пример выполнения команды пересылки содержимого регистра В в регистр С

Рис. 14.5. Пример выполнения команды пересылки содержимого ячейки памяти M в регистр C

На рис. 14.4 показан пример выполнения команды пересылки данных из регистра B в регистр С. Три младших разряда 000 однобайтовой команды являются кодом регистра-источника В, а следующие три двоичных разряда представляют код регистра-приемника информации С. После выполнения команды копия содержимого регистра В пересылаются в регистр С. Содержимое регистра B при этом остается неизменным.

Читатель, вероятно, уже обратил внимание на то, что среди кодов регистров отсутствует код 110. Наличие этого кода в регистровой команде означает, что необходимо обратиться не к одному из перечисленных регистров, а к некоторой ячейке памяти M, адрес которой хранится в регистрах H и L, причем старшая часть адреса размещается в регистре Н, а младшаяв регистре L. Команды, в которых наряду с регистровой адресацией используется косвенная, называются командами с косвенно-регистровой адресацией.

На рис. 14.5 дан пример выполнения косвенно-регистровой команды пересылки содержимого ячейки с адресом OOlA, хранящимся в регистрах Н и L, в регистр С, адрес которого 001 указан в команде. Двоичный код 110 в первых трех разрядах команды означает, что источником информации является ячейка М, адрес которой хранится в регистрах Н и L. После завершения команды содержимое ячейки копируется в регистр С.

Стековая адресация. При стековой адресации адрес операнда указывается указателем стека. Указатель стека SP это шестнадцатиразрядный регистр, содержимое которого определяет текущий адрес ячейки памяти. Следовательно, стековая адресация является косвенной. В отличие от рассмотренных выше способов косвенной адресации необходимость обращения к указателю стека следует непосредственно из кода операции команды работы со стеком.