Тип кода операции с dst и rsc

По формату КОП видно, что расположение dst и src такое же, как и в ассемблере: слева приемник (dst), справа источник (src). В простеньких микропроцессорах фирмы Intel так и было. Но в этом микропроцессоре, чтобы придать ему такие же мощные формы адресации операндов, как у микропроцессоров фирм DEC или Motorola, к dst (разряды D7, D6) «прилепили» расширение (разряды D2..DO). А для источника (разряды D5..D3) оставили по-прежнему скромные возможности: это адрес (или номер) одного из 8-ми регистров МП. Вот с него и начнем.

Посмотрим на архитектуру МП 8086 (рисунок 9.1), на адреса регистров. Видно, что здесь есть элементы с одинаковыми адресами. Например, регистр DI имеет адрес 1112, и регистр ВН имеет тот же адрес. Единственная разница в том, что DI —16-разрядный регистр, а ВН —8-разрядный. Значит, в КОП должен быть предусмотрен отличительный признак байта или слова. Это разряд D8 (W— word — слово). Для него возможны следующие случаи:

а) W = 0 — значит, что все адреса касаются однобайтовых данных;

б) W = 1 — значит, что все адреса имеют отношение к словам.

Не помешает напомнить, что байт — 8 разрядов, а слово — это 2 байта, то есть 16 разрядов. Следовательно, для нашего примера, если D8=0 (W=0), то src есть ВН; а если D8=l (W=l), то src есть DI, то есть совсем другой и уже 16-и разрядный регистр.

Теперь, что касается dst. Здесь несколько сложнее. Под адрес dst отведено 5 разрядов. Следовательно, число вариантов 25=32. Из формата видим, что основой адресации dst является mod (D7,D6) (moda — модификация). Глядя на расширение dst, обнаруживаем, что возможны принципиально только два варианта: приемник — это или регистр микропроцессора (reg), или элемент ЗУ (mem - MEMORY — память).

1-й вариант— Приемником является регистр (reg); в этом случае mod=l 1. Выделим этот вариант в виде таблицы 10.1:

Таблица 10.1

mod dst
  reg

Номера регистров в поле D2..DO определяются точно так же, как для src.

2-й вариант — Приемником является элемент ЗУ (ОЗУ или ПЗУ). Здесь возможны 24 подварианта. Их можно объединить в 7 глобальных групп (собственно, это и является главным критерием). Для mod после таблицы 10.1 осталось 3 комбинации: 002, 012, 102. Составим соответствующую этим комбинациям таблицу, где число столбцов будет 3,а число строк – 23=8 (комбинации в D2..D0). В координатных клетках обозначим уравнение адреса ЕА, то есть, как он складывается (ЕА—эффективный адрес без учета сегментного регистра).

В таблице 10.2 выделены глобальные группы в количестве 6 штук. Они определяются комбинациями разрядов D7, D6 и D2. Кроме этого, в таблице специально выделено место, которое является исключением из правил. Данный вид адресации называется прямым. Вообще, по отношению к способам адресации установилась некая терминология.

Непосредственная адресация: адрес «запрятан» в коде операции. Очевидный пример: mod=l1, значит dst — регистр, номер которого указывается в КОПе (в разрядах D2..DO).

Прямая адресация. Следом за КОПом должен следовать адрес ячейки памяти (сначала младший байт, затем — старший). Таким образом, в машинном коде сразу виден адрес dst. В таблице 10.2: mod=00, seg/mem=110.

Косвенная адресация. В коде операции указывается источник (хранилище) адреса ячейки памяти. Пример тому—место в таблице 10.2: mod=00, reg/mem=100, 101, 111. Во всех этих случаях адрес dst автоматически будет извлекаться из регистра SI, или DI, или ВХ. Значит, прежде чем обратиться к ячейке памяти, адрес этой ячейки надо загрузить в соответствующий регистр. Иначе получится на «деревню к дедушке».

Таблица 10.2. Формирование эффективного адреса dst (mod.7- 011)

Reg / mem mod (D7,D6)
D2Dl D0      
  EA=<BX>+<SI> EA=<BX>+<SI>+см.1б ЕA=<BX>+<SI>+см.2б
  EA=<BX>+<DI> EA=<BX>+<DI>+см.lб ЕA=<BX>+<DI> +см.2б
  EA=<BP>+<SI> EA=<BP>+<SI>+см.lб EA=<BP>+<SI>+см.2б
  EA=<BP>+<DI> EA=<BP>+<DI>+см.1б EA=<BP>+<DI>+см.2б
  EA=<SI> EA=<SI>+cм.lб ЕA=<SI>+см.2б
  EA=<DI> EA=<DI>+cм.lб EA=<DI>+см.2б
  Прямая адресация ЕА=адрес(2байт) EA=<BP>+cм.lб ЕА=<ВР>+см.2б
  EA=<BX> EA=<BX>+см.1б EA=<BX>+см.2б

Относительная адресация. В этом случае вместо прямого адреса следом за кодом операции располагают смещение (disp). Это смещение (в таблице 10.2 обозначено: см.) складывается с текущим адресом, который может храниться в IP, BP, ВХ, SI, DI. Причем, это смещение со знаком (старший разряд выступает в качестве знакового бита), поскольку смещение может быть как вперед, так и назад, и в дополнительном коде. Еще раз следует отметить, что положительные числа со знаком в прямом и дополнительном кодах совпадают, а отрицательное число в прямом коде преобразуют в дополнительный инверсией его (знак не меняют) и добавлением к результату единицы.

Все эти четыре способа — классика. А далее возможны комбинации из них способов со смещениями, что и следует из таблицы 10.2 для МП 8086. Здесь смещение может быть коротким (см. 1б. - смещение размером в один бант) со знаком в D7 и в дополнительном коде, или нормальным (см. 2б смещение размером в два байта) со знаком в D15 и тоже в дополнительном коде. И конечный адрес в самом сложном случае может формироваться как сумма двух регистров и смещения (смотрите mod=01, mod=10, и reg/mem=000...011). Ниже будет представлено несколько примеров на конкретной команде, но окончательно все способы адресация к ячейке ЗУ можно твердо освоить только после соответствующих практических занятий по синтезу кодов команд и ассемблера этих команд, и при выполнении этих команд на учебно-отладочном устройстве.

Теперь последний штрих к представленному материалу. Если проанализировать представленный выше формат команд, то выходит, что если приемником (dst) может быть или регистр МП, или ячейка ЗУ, то источником (src) — только регистр. Получается, что невозможно источником сделать ячейку памяти? Вот для того, чтобы это можно было сделать, в КОПе отводится еще один разряд D9 для изменения направления пересылки (d — down — вниз, обратно). Если d=0, то направление не меняется: dst остается приемником, a src - источником. Если же d=1, то направление переворачивается в обратную сторону, то есть src — становится приемником, a dst —источником.

И все равно остается проблема: как просто переслать данные из одной ячейки ЗУ в другую ячейку ЗУ? Только через регистр МП с помощью двух команд? Получается, что так. Можно только сожалеть, что столько сложностей при формировании КОП, а подобную пересылку с помощью одной команды выполнить невозможно.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: