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

По формату КОП видно, что расположение 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. Поскольку команда располагается

адрес

в ЗУ по нарастающей адреса:

       
 
   
 


0E
i+1
код операции

       
 
   
 


1F
i+3
адрес

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

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, и

адрес данные
команду в целом: С6 06 С0 1F5C.

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

Пример 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

адрес данные
Код операции C7 06, а весь машинный код: С7 06 С0 1F6D 5А. Это самая длинная команда в МП 8086.

Ко всему, что рассмотрено, следует добавить, что обращение к каждой указанной ячейке памяти будет производиться (по умолчанию) в текущем сегменте 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.


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



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