Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микропроцессорные системы (книга Комаров) / Программирование на Ассемблере (ч 3).doc
Скачиваний:
143
Добавлен:
08.03.2015
Размер:
540.67 Кб
Скачать

3.11.7. Принципы кодирования команд

В общем случае формат команд одноадресной ЭВМ имеет вид, приведенный на рис. 3.7. Поле кода операции КОП определяет функциональное назначение команды, а поле адреса указывает адрес операнда или способ его вычисления.

Поле КОП

Поле адреса

Рис. 3.7. Обобщенный формат команды одноадресной ЭВМ

Длина машинного кода команды в основном определяется используемым способом адресации. В МП ВМ86/ВМ88 длина команд может составлять от одного до шести байтов. В первых (одном или двух) байтах команды находится код операции и указывается способ адресации операндов. Последующие байты являются необязательными и содержат смещение disp или непосредственный операнд.

Команды МП ВМ86/ВМ88 могут адресовать один или два операнда и записываются на ассемблере в общем виде как COP oper или COP oper1, oper2, где COP обобщенная мнемоника, а operоперанд команды.

В двухместных командах один из операндов обязательно должен быть регистром. Следовательно, они допускают обращения типа регистр-регистр, регистрпамять или памятьрегистр, а обращения типа памятьпамять, то есть одновременная адресация двух ячеек памяти в одной команде, недопустимы. Это определяется принятым способом кодирования команд. Наиболее общий формат машинного кода двухместной команды (без непосредственного операнда) приведен на рис. 3.8, где штриховыми линиями обозначены необязательные байты команды, содержащие смещение disp.

Первый байт команды содержит код операции COP и два однобитных поля: поле направления d и поле ширины операнда w. Операнды, участвующие в операции, определяются вторым байтом команды, называемом постбайтом режима адресации. Постбайт включает в себя три поля: двухбитное поле режима адресации md, трехбитное поле операндарегистра reg и трехбитное поле операнда r/m, который может быть и регистром и ячейкой памяти.

D7

D1

D0

COP

d

w

md

reg

r/m

disp L

disp H

Рис. 3.8. Формат двухместной команды (без непосредственного операнда)

Поле ширины операнда w определяет разрядность операндов, обрабатываемых командой. При w=0 операнды являются байтами, а при w=1словами.

Поле направления d определяет операндприемник результата. При d=0 приемником результата является операнд, описываемый полем r/m, а при d=1полем reg.

Поле режима адресации md указывает способ интерпретации поля r/m при адресации операнда. Значение md=11 соответствует регистровой адресации, и поле r/m рассматривается как код регистра. Значение md< >11 соответствует адресации памяти. При этом конкретное значение md определяет ширину смещения disp, используемого при вычислении адреса операнда:

 смещение отсутствует;

 8-битное смещение, расширяемое по

знаку до 16 битов;

 16-битное смещение.

При md< >11 реализуется косвенная адресация памяти, и поле r/m определяет способ формирования эффективного адреса EA операнда. Кодирование способа адресации операнда, определяемого полем r/m, в общем случае описывается табл.3.5, в которой обозначено D8=dispL однобайтное смещение, а D16=dispH,dispLдвухбайтное смещение в команде.

Из этой таблицы следует, что всего имеется 24 варианта вычисления эффективного адреса EA памяти и 16 вариантов адресации регистров.

Приведенные в табл. 3.5 правила кодирования имеют одно исключение.

Таблица 3.5

Кодирование способов адресации операнда

md

00

01

10

11

r/m

w=0

w=1

000

001

010

011

100

101

110

111

(BX)+(SI)

(BX)+(DI)

(BP)+(SI)

(BP)+(DI)

(SI)

(DI)

D16

(BX)

(BX)+(SI)+D8

(BX)+(DI)+D8

(BP)+(SI)+D8

(BP)+(DI)+D8

(SI)+D8

(DI)+D8

(BP)+D8

(BX)+D8

(BX)+(SI)+D16

(BX)+(DI)+D16

(BP)+(SI)+D16

(BP)+(DI)+D16

(SI)+D16

(DI)+D16

(BP)+D16

(BX)+D16

AL

CL

DL

BL

AH

CH

DH

BH

AX

CX

DX

BX

SP

BP

SI

DI

При md=0 и r/m=110 смещение disp не равно 0, как следует из общего правила, а равно двухбайтному смещению D16. Это исключение позволяет реализовать прямую адресацию памяти, не предусмотренную явно форматом постбайта адресации. Смещение D16 в этом случае представляет собой абсолютный адрес операнда, то есть смещение соответствующей ячейки памяти внутри сегмента.

Однако, это исключение приводит к невозможности косвенной адресации по регистру BP (на уровне машинных кодов). Для реализации косвенной адресации по BP ассемблер кодирует ее как базовую адресацию с нулевым смещением, то есть на уровне машинных кодов [BP]=[BP+0].

D7

D1

D0

COP

s

w

md

COP

r/m

dispL

dispH

dataL

dataH

Рис. 3.9. Формат двухместной команды с непосредственным операндом

Наиболее общий формат двухместной команды с непосредственным операндом приведен на рис.3.9.

В этом случае необходимость адресации второго операнда отсутствует, и поле reg постбайта режима адресации используется для расширения кода операции. Кроме того, здесь не нужен бит d, так как результат можно загрузить только на место одного операнда. Вместо бита d используется бит s, определяющий совместно с битом w размер непосредственного операнда data:

 8битный операнд;

16битный операнд;

8битный операнд, расширяемый по

знаку до 16 битов.

Например, поле sw в машинном коде нижеприведенных команд имеет следующие значения:

MOV AL,5 (sw=00); MOV AX,5555h (sw=01); MOV AX,5 (sw=11).

Поля md, r/m, и disp интерпретируются также, как и в предыдущем формате.

Наиболее общий формат одноместной команды приведен на рис.3.10. Все поля этого формата рассмотрены выше.

При вычислении физического адреса ячейки памяти компоненты ее логического адреса выбираются в соответствии с табл.2.3. При обращении к данным сегментный регистр по умолчанию может быть заменен с помощью префикса замены сегмента на любой другой. На уровне машинных кодов префикс замены сегмента представляется предшествующим команде байтом с форматом, изображенным на рис.3.11. При этом сегментные регистры sreg кодируются следующим образом:

ES00, CS01, SS10, DS11.

D7

D4

D3

D0

0

0

1

sreg

1

1

0

Рис. 3.11. Формат префикса

замены сегмента

D7

D0

COP

w

md

COP

r/m

dispL

dispH

Рис. 3.10. Формат одноместной команды

Команды с неявной адресацией являются однобайтными и их формат приведен на рис.3.12.

COP

Рис. 3.12. Формат команды с

неявной адресацией

COP

w

reg

Рис. 3.13. Специальный укорочен-

ный формат команды

Кроме рассмотренных базовых форматов, используемых для кодирования команд, имеются специальные укороченные форматы, позволяющие на один байт сократить длину машинного кода команды. Укороченный формат используется для кодирования команд, оперирующих лишь регистрами, и имеет вид, приведенный на рис.3.13. В нем поле reg из постбайта режима адресации перенесено в первый байт команды, а постбайт исключен. Если команда является двухместной, то для ее кодирования укороченным форматом один из регистров должен быть аккумулятором AL или AX, который описывается в поле кода операции COP. Отсюда следует, что использование аккумуляторов AL или AX в качестве операндов команд способствует оптимизации длины машинного кода программы.

При трансляции программы ассемблер автоматически выбирает более короткий формат команды. Более полная информация о кодировании команд приведена в [10].

Знание форматов команд необходимо при анализе дампов памяти в процессе отладки и ремонта программ МПС.