Intel 8086 — это 16-разрядный процессор с богатым и несколько своеобразным набором команд, сложность которого отчасти обусловлена стремлением разработчиков сохранить совместимость с 8-разрядным МП Intel 8080 ранней модели. Более поздние разработки, такие как МП Intel 80286 и 80386, все еще поддерживают полный набор команд МП Intel 8086. Вооружившись подходящим мачете, выберемся из джунглей полного набора команд, сохранив лишь нужные нам сейчас 10 арифметических команд и 11 прочих. Вот они:
Краткий обзор. Некоторые пояснения: первые шесть арифметических команд работают с парами чисел (2-х операндные команды), которые мы обозначим как
MOV count,CX
ADD small,02H
AND AX,007FH
имеют аргументы типов
Последние четыре арифметические операции имеют только один операнд, который может быть содержимым либо регистра, либо ячейки памяти. Вот два примера:
INC count
NEG AL
Первая команда прибавляет 1 к ячейке памяти, именуемой count, а вторая изменяет знак содержимого регистра AL.
Лирическое отступление: адресация. Прежде, чем продолжить, несколько слов по поводу адресации регистров и памяти. Процессор Intel 8086 предлагает использовать 8 его регистров общего назначения, однако после изучения рис. 10.2 вы придете к заключению о том, что большинство этих регистров используются специфически.
Рис. 10.2.
Четыре из них (A-D) могут быть использованы как в виде единых 16-разрядных регистров (АХ, где X означает
Данные, используемые в командах, могут представлять собой константу, величину, содержащуюся в регистре или величину, содержащуюся в памяти. Константы вы указываете, просто записывая их, а регистры - по именам, так, как было показано выше. Для адресации памяти МП Intel 8086 обеспечивает 6 режимов адресации, три из которых пояснены схемами на рис. 10.3.
Рис. 10.3.
Вы можете прямо указать имя переменной, в этом случае ее адрес при ассемблировании будет определяться парой байтов, следующих сразу же за командой; вы можете занести адрес переменной в один из регистров, используемых для адресации (ВХ, ВР, SI или DI), а затем выполнить команду, в которой предусмотрена косвенная адресация через соответствующий регистр; можно модифицировать последний режим адресации и получать адрес переменной, прибавляя константу смещения к содержимому регистра, используемого для адресации. Косвенный режим быстрее (в предположении, что адрес уже загружен в соответствующий регистр) и является гораздо более приемлемым, если вы хотите выполнять некоторые операции над множеством чисел (строкой или массивом).
Вот несколько примеров адресации:
MOV count,100Н (прямая, непосредственная)
MOV [ВХ],100Н (косвенная, непосредственная)
MOV [ВХ + 1000Н], (адресация по базе, регистр)
АХ
В двух последних командах предполагается, что мы уже загрузили адрес в ВХ. Последняя команда копирует содержимое АХ в ячейку памяти, смещенную на 4 К (1000-ричное) выше от ячейки, на которую указывает ВХ; ниже мы вкратце рассмотрим пример, иллюстрирующий, как можно использовать эту команду для копирования массива.