<< Вернуться у выбору материала

7. Лекция: Кодирование команд (часть 1)

Введите ваш запрос для начала поиска.

Купить автозапчасти 40 company оптом wd40 купить оптом www.wd-40.com.ua.

Рассматриваются практические вопросы, связанные с машинным представлением команд различных форматов и с различными режимами адресации операндов, с дизассемблированием команд, с оценкой влияния структуры программы на время ее выполнения.

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

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

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

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

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

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

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

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

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

Пример 1.

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

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

ADD AX,CX

Согласно таблица 6.2 машинное представление этой команды имеет вид:

000000dw md reg r/m

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

Так как оба операнда располагаются в регистрах общего назначения, то любой из них можно закодировать в поле reg. Поэтому команда может иметь два различных представления в машинном коде. При этом, если в поле reg закодирован номер регистра AX, то бит приемника результата d=1. Если в поле reg закодирован номер регистра CX, то бит приемника результата d=0.

бит приемника результата d=0

или

бит приемника результата d=0

Здесь и далее в записи команд b означает двоичное представление, h - 16-е.

После выполнения команды в 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

Машинное представление:

Символическая запись команды:  ADD AX,56B3h  Машинное представление

Если непосредственный операнд имеет величину, которая может быть закодирована в одном байте, например, 77 (в десятичной системе счисления), что при представлении в дополнительном коде дает 0100 1101b = 4Dh, то за счет использования признака s удается сократить длину команды:

0100 1101b = 4Dh

Данное представление команды построено по общей схеме команд суммирования любого регистра с непосредственным операндом. Так как в нашем случае непосредственный операнд суммируется с содержимым регистра AX, то команда может быть записана в специальном формате работы с регистром- аккумулятором и иметь меньшую длину:

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

Возможность использования признака s в этом формате отсутствует.

Пусть перед началом выполнения команды (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.

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

Пример 6.

Операнд a находится в AX. Операнд b является элементом массива, первый элемент которого помечен меткой MAS, а положение операнда b в массиве определяется содержимым регистра BX (рис. 7.1).

Организация доступа к операнду при регистровой относительной адресации

Рис. 7.1. Организация доступа к операнду при регистровой относительной адресации

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

ADD AX,MAS[BX]

При ассемблировании программы метке ставится в соответствие смещение относительно начала сегмента. Таким образом, операнд b будет определяться в данном случае с помощью регистровой относительной адресации (суммирование значения смещения и содержимого регистра).

Пусть начало массива MAS имеет смещение в 3000h байтов от начала сегмента DS. Тогда машинный код команды будет иметь вид:

Если перед выполнением команды (AX)=1234, (BX)=0074, [3474]=E6, [3475]=64, (IP)=0102, то результатом будет: (AX)=771A, (IP)=0106.

Если начало массива располагается со смещением 70h байтов от начала сегмента DS, то программа Ассемблера сформирует более короткий машинный код команды:

Если исходное состояние элементов хранения совпадает с предыдущим, за исключением (BX)=3004, то и результат будет таким же, за исключением (IP)=0105.

Пример 7.

Операнд a находится в регистре AL. Операнд b является элементом массива, начальный адрес которого находится в регистре BX. Положение элемента в массиве определяется регистром DI (рис. 7.2). В этом случае обращение к операнду b происходит посредством базово-индексной адресации.

Расположение операнда при базово-индексной адресации

Рис. 7.2. Расположение операнда при базово-индексной адресации

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

ADD AL,[BX+DI]

Так как первый операнд находится в регистре AL, то он имеет длину 1 байт. Поэтому в машинном представлении команды w=0, и она выглядит следующим образом:

Если до начала выполнения команды (AX)=25B7, (BX)=3000, (DI)=0474, [3474]=77, (IP)=2519, то после ее выполнения произойдут следующие изменения: (AX)=252E, (IP)=251B. Обратим внимание на то, что содержимое регистра AL представляет собой младший байт регистра AX. Так как операция проводится над байтами, то перенос в старший байт регистра AX блокируется.

Пример 8.

Операнд a находится в регистре AH. Операнд b является элементом двумерного массива, первый элемент которого помечен меткой MAS. Длина (в байтах) от начала массива до начала строки, в которой расположен операнд, хранится в регистре BX, а в регистре DI хранится количество байт от начала текущей строки до операнда b (рис. 7.3).

Расположение операнда при относительной базово-индексной адресации

Рис. 7.3. Расположение операнда при относительной базово-индексной адресации

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

ADD AH,MAS[BX+DI]

Машинный код команды будет зависеть от того, как далеко относительно начала сегмента располагается начало массива (см. пример 6). Если это смещение занимает 2 байта и, например, равно 1D25, то машинный код команды имеет вид:

Если смещение более короткое и может быть записано в одном байте, например, 2D, то машинное представление команды следующее:

При (AX)=84A3, [(BX)+(DI)+disp8]=3474, [3474]=77, (IP)=0110 результат будет (AX)=FBA3, (IP)=0114 в первом случае и (IP)=0113 во втором.

Пример 9.

Операнд a находится в оперативной памяти по прямому адресу 3474. Адрес операнда b, также находящегося в оперативной памяти, содержится в регистре SI.

Сложение этих операндов невозможно выполнить, используя только одну команду, так как система команд не предусматривает сложения операндов формата "память-память". Поэтому одним из возможных вариантов решения этого примера может быть:

MOV AX,[SI]; AX=b
ADD [3474h],AX; a=a+b

Кодирование каждой из этих команд проводится по рассмотренным выше правилам.

Рейтинг@Mail.ru