Главная > Схемотехника > Искусство схемотехники, Т.2
<< Предыдущий параграф
Следующий параграф >>
<< Предыдущий параграф Следующий параграф >>
Макеты страниц

10.03. Упрощенный набор команд процессора Intel 8086/8

Intel 8086 - это 16-разрядный процессор с богатым и несколько своеобразным набором команд, сложность которого отчасти обусловлена стремлением разработчиков сохранить совместимость с -разрядным МП Intel 8080 ранней модели. Более поздние разработки, такие как МП Intel 80286 и 80386, все еще поддерживают полный набор команд МП Intel 8086. Вооружившись подходящим мачете, выберемся из джунглей полного набора команд, сохранив лишь нужные нам сейчас 10 арифметических команд и 11 прочих. Вот они:

Краткий обзор.

Некоторые пояснения: первые шесть арифметических команд работают с парами чисел операндные команды), которые мы обозначим как , а и которые могут представлять собой любую из пяти пар, указанных в примечании; при этом означает содержимое ячейки памяти, означает содержимое регистра ЦП (их 8), - непосредственный аргумент, который представляет собой число, располагаемое в следующих за командой от 1 до 4 байт памяти. Таким образом, например, команды:

имеют аргументы типов соответственно. Первая копирует содержимое регистра СХ в ячейку памяти, именуемую count; вторая прибавляет 2 к содержимому другой ячейки памяти, именуемой small; третья обнуляет 9 старших разрядов -разрядного регистра АХ, сохраняя при этом 7 младших разрядов неизменными (так называемая операция маскирования). Отметим принятое фирмой Intel соглашение о порядке аргументов: первый аргумент замещается вторым или модифицируется на основе значения второго аргумента. (В следующей главе мы увидим, что Motorola предписывает другой порядок действий).

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

Первая команда прибавляет 1 к ячейке памяти, именуемой count, а вторая изменяет знак содержимого регистра .

Лирическое отступление: адресация.

Прежде, чем продолжить, несколько слов по поводу адресации регистров и памяти. Процессор Intel 8086 предлагает использовать 8 его регистров общего назначения, однако после изучения рис. 10.2 вы придете к заключению о том, что большинство этих регистров используются специфически. Четыре из них могут быть использованы как в виде единых -разрядных регистров (АХ, где X означает -расширенный), так и в виде пар байтовых регистров [АН, AL, соответственно Н означает старший (high) байт регистра АХ, a AL - младший (low) байт]. Регистры ВХ и ВР, та? же как и SI, DI, могут содержать адреса и предназначены для использования при адресации (см. ниже). Специальные циклические команды (которые мы исключили из нашего краткого перечня) используют регистр С, а команды умножения/деления и ввода-вывода используют регистры А и D.

Данные, используемые в командах, могут представлять собой константу, величину, содержащуюся в регистре или величину, содержащуюся в памяти. Константы вы указываете, просто записывая их, а регистры - по именам, так, как было показано выше. Для адресации памяти МП Intel 8086 обеспечивает 6 режимов адресации, три из которых пояснены схемами на рис. 10.3.

Рис. 10.2. Регистры общего назначения МП 8086.

Рис. 10.3. Некоторые способы адресации.

Вы можете прямо указать имя переменной, в этом случае ее адрес при ассемблировании будет определяться парой байтов, следующих сразу же за командой; вы можете занести адрес переменной в один из регистров, используемых для адресации (ВХ, BP, SI или DI), а затем выполнить команду, в которой предусмотрена косвенная адресация через соответствующий регистр; можно модифицировать последний режим адресации и получать адрес переменной, прибавляя константу смещения к содержимому регистра, используемого для адресации. Косвенный режим быстрее (в предположении, что адрес уже загружен в соответствующий регистр) и является гораздо более приемлемым, если вы хотите выполнять некоторые операции над множеством чисел (строкой или массивом). Вот несколько примеров адресации:

В двух последних командах предполагается, что мы уже загрузили адрес в ВХ. Последняя команда копирует содержимое АХ в ячейку памяти, смещенную на 4 К (-ричное) выше от ячейки, на которую указывает ВХ; ниже мы вкратце рассмотрим пример, иллюстрирующий, как можно использовать эту команду для копирования массива.

При адресации памяти для МП 8086 существует сложность другого рода, которую мы было «замели под ковер»: адрес, формируемый в любом из вышеуказанных режимов адресации, не является окончательным, действительным адресом, поскольку получаемый таким образом адрес имеет только 16 разрядов (и может адресовать только 64 Кбайт памяти). На самом деле то, что вычисляется по указанным выше правилам, называется смещением. Для того чтобы получить действительный, физический адрес, вы должны прибавить к смещению -разрядную базовую величину, получаемую сдвигом на 4 разряда влево содержимого -разрядного сегментного регистра (таких регистров имеется 4). Другими словами, МП 8086 позволяет вам обращаться к областям памяти по 64 Кбайт; положение этих «сегментов» внутри полного адресного пространства 1 Мбайт, что в свою очередь определяется содержимым сегментных регистров. Использование -разрядной адресации в МП 8086 по большому счету было большой ошибкой, унаследованной от ранних поколений. Более современные МП (начиная с 80386, а также серии 68000) сделаны как надо во всех отношениях, с -разрядной адресацией. Для того чтобы не усложнять наши примеры, мы просто игнорируем сегменты вообще; на практике вы, конечно, должны будете о них побеспокоиться.

Обзор набора команд (продолжение).

Рассмотрим теперь команды управления стеком PUSH и POP. Стек - это часть памяти, организованная специальным образом: когда вы заносите некоторое значение в стек (выполняя операцию push), это значение заносится в очередную доступную ячейку (вершину стека); а когда вы извлекаете значение из стека (выполняя операцию POP), оно выбирается из вершины стека, т. е. выбирается то, что было занесено в стек последним. Таким образом, стек - это последовательный набор данных, организованный по принципу: последним пришел - первым вышел. Вам, может быть, будет легче освоить это понятие, если вы представите себе монетную кассу водителя автобуса или стопку подносов в столовой.

Рис. 10.4 показывает, как работает стек. Стек располагается в обычном ОЗУ, а указатель стека (регистр SP) ЦП обеспечивает возможность доступа к той ячейке памяти, которая является «вершиной» в данный момент времени. Для МП 8086 стек состоит из -разрядных слов и по мере занесения в него данных «растет» вниз в ОЗУ. Содержимое регистра SP автоматически декрементируется на 2 перед каждой операцией PUSH и инкрементируется на 2 после каждой операции POP. Таким образом, например, -разрядное содержимое регистра АХ копируется в вершину стека командой PUSH АХ; SP указывает на последний занесенный байт. Команда POP выполняется в обратном порядке, как показано на рис. 10.4. Мы увидим, что при реализации вызовов подпрограмм и прерываний стек играет ведущую роль.

Команда JMP заставляет ЦП отклониться от обычной процедуры последовательного выполнения команд, переходя к выполнению той команды, на которую совершается переход. Команда условного перехода (возможно 8 различных вариантов, обозначаемых обычно J с с) проверяет регистр , который располагается в ЦП (биты разрядов этого регистра устанавливаются в соответствии с результатом выполнения самой последней арифметической операции), а затем либо выполняет переход (если условие истинно), либо выполняет следующую за командой условного перехода команду (если условие не истинно). Программа 10.1 показывает пример условного перехода. Она копирует 100 слов из массива, начинающегося с адреса , в новый массив, начинающийся на 1 Кбайт , выше.

Рис. 10.4. Операции со стеком.

Отметим явную загрузку указателя (в регистр ВХ, используемый для адресации) и счетчика цикла (в CL). Собственно массив слов должен быть пропущен через регистр (мы выбрали АХ), поскольку МП 8086 не поддерживает команды типа память-память (см. примечание к набору команд). В конце цикла и команда «перейти, если не нуль»

более не выполняется. Этот пример будет работать однако на практике вам, возможно, следует использовать более быстрые команды МП 8086 - пересылки строк.

Рис. 10.5. Работа команды CALL.

Хорошим тоном в практическом программировании считается использование символьных имен для обозначения массивов и их размеров вместо соответствующих констант, таких как .

Оператор CALL является вызовом подпрограммы; он подобен каманде перехода, за исключением того, что адрес возврата (адрес команды, следующей за командой CALL) заносится в стек. В конце подпрограммы вы выполняете оператор RET, который извлекает из стека его содержимое так, чтобы программа могла найти «обратную дорогу» (рис. 10.5). Три оператора STI, CLI и IRET имеют отношения к прерываниям, их работу мы проиллюстрируем вместе с примерами соответствующих электрических схем и ниже в этой главе. Наконец, команды ввода-вывода IN и OUT пересылают слово или байт между регистром А и соответствующим образом адресованным портом; подробнее об этом чуть позже.

<< Предыдущий параграф Следующий параграф >>
Оглавление