Кодирование команд (часть 1)
С целью лучшего понимания архитектуры ЭВМ рассмотрим машинное представление команд различных форматов, использующих различные режимы адресации операндов.
Рассмотрим это на примере операции сложения. Так как в системе команд ЭВМ, базирующихся на микропроцессорах фирмы 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.
или
Здесь и далее в записи команд 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
Если непосредственный операнд имеет величину, которая может быть закодирована в одном байте, например, 77 (в десятичной системе счисления), что при представлении в дополнительном коде дает 0100 1101b = 4Dh, то за счет использования признака s удается сократить длину команды:
Данное представление команды построено по общей схеме команд суммирования любого регистра с непосредственным операндом. Так как в нашем случае непосредственный операнд суммируется с содержимым регистра 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.