По формату КОП видно, что расположение dst и формирование его точно такое же, как и в первом типе формата. Поэтому все выше изложенное справедливо и для этого типа формата команд. Из-за отсутствия src три разряда D5..D3 используются в качестве расширения КОП. КОП также поглотил и разряд D9, поскольку при одном абоненте об изменении направления пересылки говорить бессмысленно.
Теперь можно перейти к командам.
Команда: MOV dst, src
КОП команды MOV:
микро КОП
Рассмотрим пару примеров по синтезу ассемблера и машинного кода.
Пример 1 — Переслать содержимое регистра BL в регистр AL.
Кратко: AL: = <BL>.
Ответ:
а) ассемблер: MOV AL, BL;
б) машинный кол;
w=0 (1 байт);
d=0 (направление не меняется);
src=011 (адрес регистра BL, - из рисунка 9.1);
dst=11 000 (mod=11— из таблицы 10.2; reg/mem=reg=000 — адрес регистра AL — из рисунка 9.1).
Составляем КОП:
8 8 D 8
Разбиваем КОП на тетрады и переводим в Н-код (шестнадцатеричный код). Получается, что вся команда состоит из одного КОПа 88D8, так как адресация src и dst —непосредственная.
Пример 2 — Отправить в ячейку памяти с адресом 1FCO содержимое регистра CL. Кратко: M1FC0: =<CL> (M —от MEMORY —память);
Ответ:
а) ассемблер: MOV [1FCO], CL (в квадратных скобках указывается или адрес — при прямой адресации, или источник адреса — при косвенной адресации, или источник плюс смещение, или источник плюс источник плюс смещение— при комбинационной адресации);
б) машинный код: w=0; d=0; src=001; dst=[mod=00; reg/mem=110]; составляем КОП:
8 8 0 E
Разбиваем на тетрады и получаем КОП=880Е. А вся команда будет выглядеть так: 88 ОЕ СО 1 F. Поскольку команда располагается
адрес
в ЗУ по нарастающей адреса:
|
|
|
|
то можно заметить, что многобайтовое число в ЗУ располагается таким образом: младшая часть располагается по младшему адресу, старшая часть—по старшему адресу. Это правило справедливо для всех типов микропроцессоров. Следующая команда — команда загрузки данных в приемник:
MOV dst, data
Формат команды:
расширение микро КОП
микро КОП
Рассмотрим пример.
Пример 3 —Данные 5С отправить в ячейку памяти с адресом 1FCO. Кратко: M1FCO:=5C.
Ответ:
3) длина пересылаемых данных —1 байт;
2) ассемблер: MOV BYTE [lFCO] (byte —байт—длина данных; обязательно нужно указывать, если dst— память);
3) машинный код: w=0, dst =00 110 (mod=00, reg/mem=110); составляем КОП:
C 6 0 6
Разбиваем на тетрады и записываем КОП в Н-коде: С6 06, и
|
Еще один пример.
Пример 4 — Необходимо переслать два байта в две ячейки памяти: М1FCO:=6D, M1FC1 :=5A.
Ответ: поскольку МП 8086—16-разрядный, и учитывая, что байты отправляются в две соседние ячейки ЗУ, оформляем это следующим образом:
1) ассемблер: MOV WORD [IFCO], 5A6D (word —слово, то есть 2 байта: смотрите пример 3).
В команде число 5A6D пишется как единое число, и поскольку 5А располагается по адресу 1FC1, то в 16-разрядном числе оно и является старшим (как уже отмечалось выше), a 6D —младшим. А вот адрес в команде можно указывать только один. Поэтому принято во всех видах микропроцессоров для многобайтового слова указывать адрес только младшей его части.
2) машинный код: w=l:
C 7 0 6
|
Ко всему, что рассмотрено, следует добавить, что обращение к каждой указанной ячейке памяти будет производиться (по умолчанию) в текущем сегменте DS. Но как быть, если надо указать непосредственно физический адрес, ну, допустим A=3B8DO? В этом случае необходимо разделить (по своему усмотрению, если нет других условий) сегмент и текущий адрес в сегменте. Пусть DS=3B00. Тогда
ЕА =_3B8D0
3В00
08D0 — текущий адрес внутри сегмента (эффективный адрес).
Если известно, как переслать данные по адресу ЕА внутри сегмента, то, как обратится к физическому адресу? Ведь нужно еще и загрузить значение сегмента данных в DS: DS: =3B00. Для этих целей разработана специальная группа команд — сегментные команды. Обозначим сегментный регистр (их четыре) обобщенным обозначением RS.
1) MOV RS,dst; Комментарий: RS: = <dst>.
расширение микро КОП
микроКоп
№ RS
Формат кода операции:
2)МОУ dst,RS; Комментарий: dst:= <RS>; Формат кода операции:
расширение микро КОП
микроКОП
№ RS
Из обоих форматов видно, что пересылка из RS или в RS отличается только первым байтом КОП. Рассмотрим пример.
Пример 5 —Необходимо выполнить действие: М3В8D0 = <АL>.
Ответ: распишем последовательность действий:
1) в любой регистр (кроме АХ) загрузим данные для DS; пусть это будет СХ: СХ:=ЗВ00;
2) перешлем: DS: = <CX>;
3) перешлем: M DS: ЕА = М3В00: 8D0 = М3В8D0 = <AL>.
И пусть эта последовательность команд будет расположена с адреса 0100 (адрес—в Н-коде).
Адрес | Машинный код | Ассемблер | Комментарий |
С7 С1 3B | MOV CX, 3B00 | В регистр СХ загрузить данные 3B00 | |
8E D9 | MOV DS,CX | В сегментный регистр DS переслать содержимое СХ | |
D0 | MOV [08D0],AL | Загрузить в ячейку памяти c адресом DS:08D0=3B8D0 содержимое AL |
КОП только второй команды с сегментным регистром. Собственно говоря, типы первой и третьей команды уже рассматривались, поэтому составим только его вторую часть (2-й байт). Из архитектуры МП (рисунок 9.1) определяем номер DS: № DS=112.
D 9
mod=>RG № RS CX
Переводим вторую половину КОП в Н-код: D9; а весь КОП=8Е D9.