назад
Кодирование команд

С целью лучшего понимания архитектуры ЭВМ рассмотрим машинное представление команд различных форматов,

использующих различные режимы адресации операндов.

Рассмотрим это на примере операции сложения. Так как в системе команд ЭВМ, базирующихся на микропроцессорах фирмы Intel, результат операции записывается на место первого операнда, то данная операция будет иметь вид: a=a+b.

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

Общий формат ассемблерной команды имеет следующий вид:

[Метка:]  Мнемоника_операции  Операнд,Операнд [;  Комментарий]  

Метка - это идентификатор, присваиваемый адресу первого байта команды. Наличие метки в команде необязательно.

При отсутствии метки двоеточия быть не должно.

Во всех командах необходимо наличие мнемоники, обозначающей выполняемую команду.

Наличие и количество (один или два) операндов зависит от команды. В случае двух операндов они разделяются запятой,

при этом первым указывается операнд-приемник, а вторым - операнд-источник.

Примеры обозначения операндов при различных режимах адресации будут рассмотрены ниже.

Поле комментария предназначено для пояснения программы и может содержать любую комбинацию символов.

При отсутствии комментария точка с запятой может не ставиться.

Кодирование линейных команд

Пример 1.

Оба операнда находятся в регистрах общего назначения: (AX)=a; (CX)=b.

Для обращения к операндам используется прямая регистровая адресация.

Символическая запись команды:

ADD AX,CX  
По условию операнды занимают полноразрядные регистры длиной 1 слово.

После выполнения команды в AX будет записана сумма содержимого регистров AX и CX,

а указатель команды IP увеличится на длину выполненной команды (2 байта) и будет указывать на первый байт следующей команды.

Здесь и далее представление информации будем давать в 16-м виде.

Если перед началом выполнения команды (AX)=0C34, (CX)=1020, (IP)=0012, то после ее выполнения (AX)=1C54, (CX)=1020, (IP)=0014.


Пример 2.

Операнд a находится в регистре AX, b - непосредственный операнд, равный 56B3h.

Символическая запись команды:

ADD AX,56B3h  
Данное представление команды построено по общей схеме команд суммирования 

любого регистра с непосредственным операндом. Так как в нашем случае непосредственный

операнд суммируется с содержимым регистра AX, то команда может быть записана в специальном

формате работы с регистром- аккумулятором и иметь меньшую длину:

для операнда 56B3h.

Пусть перед началом выполнения команды (AX)=03A4, (IP)=0012.

Тогда результатом выполнения команды ADD AX,56B3h будет: (AX)=5A57, (IP)=0016,

а результатом выполнения команды ADD AL,B3h будет: (AX)=0357, (IP)=0015,

если команда закодирована по общей схеме, и (IP)=0014 - если по схеме суммирования с аккумулятором.

Отметим, что в последнем случае действие выполняется лишь с младшим байтом регистра AX,

то есть с регистром AL, и его результат не влияет на содержимое AH.

Пример 3.

Операнд a находится в AX, операнд b - в оперативной памяти по прямому адресу 3474h.

Символическая запись команды:

ADD AX,[3474h]

Пусть перед выполнением команды (AX)=1234, [3474h]=1A, [3475h]=25, (IP)=0012.

Напомним, что адрес слова в оперативной памяти - это адрес его младшего байта.

Тогда после выполнения команды: (AX)=374E, (IP)=0016.

Пример 4.

Если операнд a находится в оперативной памяти по прямому адресу 3474h, а операнд

b представляет собой непосредственный операнд, равный 56B3h, то символическая запись команды имеет вид:

ADD [3474h],56B3h 

При тех же исходных данных, что и в примере 3, результатом операции будет: [3474]=CD, [3475]=7B, (IP)=0018.

Внимание: для выполнения задания в отладчике Debug значение 56B3h необходимо присвоить регистру DX. Тогда

символическая запись имеет вид:

MOV DX,56B3
ADD [3474],DX

Пример 5.

Операнд a находится в слове оперативной памяти, адрес которого хранится в регистре BX,

а операнд b - в регистре AX. В этом случае адресация операнда a - регистровая косвенная.

Символическая запись команды:

ADD [BX],AX  

Если перед выполнением команды (AX)=1234, (BX)=3474, [3474]=D7, [3475]=11, (IP)=0012,

то в результате выполнения команды произойдут следующие изменения: [3474]=0B, [3475]=24, (IP)=0014.