Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Булатов В.Н. Архитектура микропроцессороной системы, состав машинных команд и основы программирования микропроцессорной .pdf
Скачиваний:
97
Добавлен:
02.05.2014
Размер:
7.1 Mб
Скачать

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

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

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

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

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

Не помешает напомнить,

что байт —

8 разрядов,

а слово — это

2 байта, то есть 16 разрядов.

Следовательно,

для нашего

примера, если

D8=0 (W=0), то src есть BH; а если D8=1 (W=1), то src есть DI, то есть совсем другой и уже 16-и разрядный регистр.

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

(mem - MEMORY — память). 1-й вариант

Приемником является регистр (reg); в этом случае mod=11. Выделим этот вариант в виде таблицы 2:

Таблица 2 mod dst

11 reg

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

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

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

23

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

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

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

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

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

Reg/mem

 

mod (D7,D6)

 

D2 D1 D0

00

01

 

10

0 0 0

EA=<BX>+<SI>

EA=<BX>+<SI>+см.1б

 

EA=<BX>+<SI>+см.2б

0 0 1

EA=<BX>+<DI>

EA=<BX>+<DI>+см.1б

 

EA=<BX>+<DI>+см.2б

0 1 0

EA=<BP>+<SI>

EA=<BP>+<SI>+см.1б

 

EA=<BP>+<SI>+см.2б

0 1 1

EA=<BP>+<DI>

EA=<BP>+<DI>+см.1б

 

EA=<BP>+<DI>+см.2б

1 0 0

EA=<SI>

EA=<SI>+см.1б

 

EA=<SI>+см.2б

1 0 1

EA=<DI>

EA=<DI>+см.1б

 

EA=<DI>+см.2б

1 1 0

Прямая адресация

EA=<BP>+см.1б

 

EA=<BP>+см.2б

 

EA=адрес(2 байт)

 

 

 

1 1 1

EA=<BX>

EA=<BX>+см.1б

 

EA=<BX>+см.2б

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

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

24

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

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

— источником. Если же d=1, то направление переворачивается в обратную сторону, то есть src — становится приемником, а dst —источником.

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

3.2 Тип кода операции с dst. Группа коман MOV

По формату КОП видно, что расположение dst и формирование его точно такое же, как и в первом типе формата. Поэтому все выше изложенное справедливо и для этого типа формата команд. Из-за отсутствия src три разряда D5..D3 используются в качестве расширения КОП. КОП также поглотил и разряд D9, поскольку при одном абоненте об изменении направления пересылки говорить бессмысленно.

Теперь можно перейти к командам. Команда:

MOV dst,src

КОП команды MOV: микро КОП

Рассмотрим пару примеров по синтезу ассемблера и машинного кода. Пример 1 — Переслать содержимое регистра BL в регистр AL.

Кратко: AL:=<BL>.

Ответ:

а) ассемблер: MOV AL,BL;

б) машинный код: w=0 (1 байт);

d=0 (направление не меняется);

25

src=011 (адрес регистра BL — из рисунка 3);

dst=11 000 (mod =11— из таблицы 2; reg/mem=reg=000 — адрес регистра AL —

из рисунка 3). Составляем КОП:

Разбиваем КОП на тетрады и переводим в H-код (шестнадцатеричный код). Получается, что вся команда состоит из одного КОПа 88D8, так как адресация src и dst —непосредственная.

Пример 2 —Отправить в ячейку памяти с адресом 1FC0 содержимое регистра CL. Кратко: M1FC0:=<CL> (М —от MEMORY — память);

Ответ:

а) ассемблер: MOV [1FC0],CL (в квадратных скобках указывается или адрес — при прямой адресации, или источник адреса — при косвенной адресации, или источник плюс смещение, или источник плюс источник плюс смещение — при комбинационной адресации);

б) машинный код: w=0; d=0; src=001; dst=[mod=00; reg/mem=110];

составляем КОП:

Разбиваем на тетрады и получаем КОП=880E. А вся команда будет выглядеть так: 88 0E CO 1F. Поскольку команда располагается в ЗУ по

нарастающей адреса:

адрес

 

то можно заметить, что многобайтовое число в ЗУ располагается таким образом: младшая часть располагается по младшему адресу, старшая часть —по старшему адресу. Это правило справедливо для всех типов микропроцессоров.

26

Следующая команда — команда загрузки данных в приемник:

MOV dst,data

Формат команды:

Рассмотрим пример.

Пример 3 —Данные отправить в ячейку памяти с адресом

1FC0.

Кратко: M1FC0:=5C. Ответ:

1)длина пересылаемых данных —1 байт;

2)ассемблер: MOV BYTE [1FC0],5C (byte —байт —длина данных;

обязательно нужно указывать, если dst —память);

3) машинный код: w=0, dst=00 110 (mod=00, reg/mem=110);

составляем КОП:

Разбиваем на тетрады и записываем КОП в H-коде: C6 06, и

команду в целом:

C6 06 C0 1F 5C .

Еще один пример.

адрес данные

 

Пример 4 — Необходимо переслать два байта в две ячейки памяти:

M1FC0:=6D, M1FC1:=5A.

Ответ: поскольку МП 8086 —16-разрядный, и учитывая, что байты отправляются в две соседние ячейки ЗУ, оформляем это следующим образом:

1) ассемблер: MOV WORD [IFC0],5A6D (word —слово, то есть

2байта: смотрите пример 3).

Вкоманде число 5A6D пишется как единое число, и поскольку 5A располагается по адресу 1FC1, то в 16-разрядном числе оно и является старшим (как уже отмечалось выше), а 6D —младшим. А вот адрес в команде можно указывать только один. Поэтому принято во всех видах микропроцессоров для многобайтового слова указывать адрес только младшей его части.

27

адрес данные

Код операции C7 06, а весь машинный код: C7 06 C0 1F 6D 5A. Это самая длинная команда в МП 8086.

Ко всему, что рассмотрено, следует добавить, что обращение к каждой указанной ячейке памяти будет производиться (по умолчанию) в текущем сегменте DS. Но как быть, если надо указать непосредственно физический адрес, ну, допустим А=3B8D0? В этом случае необходимо разделить (по своему усмотрению, если нет других условий) сегмент и текущий адрес в сегменте. Пусть DS=3B00. Тогда

EA = 3B8D0 3В00

08D0 — текущий адрес внутри сегмента (эффективный

адрес).

Если известно, как переслать данные по адресу EA внутри сегмента, то как обратится к физическому адресу? Ведь нужно еще и загрузить значение сегмента данных в DS: DS:=3B00. Для этих целей разработана специальная группа команд — сегментные команды. Обозначим сегментный регистр (их четыре) обобщенным обозначением RS.

1) MOV RS,dst; Комментарий: RS:= <dst>.

Формат кода операции:

Из обоих форматов видно, что пересылка из RS или в RS отличается только первым байтом КОП. Рассмотрим пример.

Пример 5 —Необходимо выполнить действие: M3B8D0:=<AL>. Ответ: распишем последовательность действий:

1)в любой регистр (кроме AX) загрузим данные для DS; пусть это будет CX: CX:=3B00;

2)перешлем: DS:= <CX>;

3)перешлем: MDS:EA = M3B00:8D0 = M3B8D0 = <AL>.

Ипусть эта последовательность команд будет расположена с адреса

0100 (адрес — в H-коде).

Адрес

Машинный код

Ассемблер

Комментарий

0100

C7

MOV CX,3B00

В регистр CX

0101

C1

 

загрузить

0102

00

 

данные 3B00

0103

3B

 

 

0104

8E

MOV DS,CX

В сегментный регистр DS

0105

D9

 

переслать содержимое CX

0106

88

MOV [08D0],AL

Загрузить в ячейку памяти

0107

06

 

с адресом DS:08D0=3B8D0

0108

D0

 

содержимое AL

0109

08

 

 

КОП только второй команды с сегментным регистром. Собственно говоря, типы первой и третьей команды уже рассматривались, поэтому составим только его вторую часть (2-й байт). Из архитектуры МП (рисунок 3) определяем номер DS: № DS= 112.

Переводим вторую половину КОП в H-код: D9; а весь КОП=8E D9.

29