1. Введение
Настоящее руководство содержит описание инструкций процессоров 8086 и 8088. Набор инструкций процессора представляет собой самый нижний (машинный) уровень программного обеспечения компьютера. Программирование на этом уровне представляет из себя весьма непростую задачу по той причине, что выполняемые каждой инструкцией функции довольно просты, и поэтому любая сколько-нибудь сложная программа включает в себя большое количество инструкций и обычно теряет наглядность. Кроме того, программист обязан знать многие архитектурные и функциональные особенности компьютера, о которых он может не думать при программировании на языках высокого уровня. С другой стороны, только набор машинных инструкций предоставляет программисту все возможности компьютера.
Инструкции процессора доступны пользователю через программу MASM.
Процессоры 8086 и 8088 выполняют один и тот же набор инструкций. Этот набор включает в себя эквиваленты инструкций более ранних микропроцессоров 8080/8085. Существенно новым является следующее:
Умножение и деление знаковых и беззнаковых двоичных чисел, а также десятичных чисел в упакованном и неупакованном форматах.
Операции перемещения, сканирования и сравнения строк длиной до 64К.
Тестирование битов без их изменения.
Перевод содержимого байтов из одного кода в другой (трансляция).
Программно-генерируемые прерывания.
Группа инструкций, которые могут оказывать влияние на работу систем микропроцессора.
Инструкции процессора в унифицированной форме обрабатывают различные типы операндов. Почти каждая инструкция может оперировать с байтом или словом на выбор. Регистры, переменные памяти (поля памяти, представленные адресами) и непосредственные операнды могут кодироваться в большинстве инструкций без ограничений, за исключением, разумеется, того, что непосредственный операнд может быть только источником, но не приёмником. В частности, переменные памяти могут участвовать в операциях сложения, вычитания, сдвига, сравнения и других без предварительного помещения их в регистры, что экономит инструкции, регистры и время выполнения ассемблерной программы. Для языков высокого уровня, где большинство переменных размещено в памяти, компиляторы могут генерировать более быстродействуюший и меньший по объему объектный код.
Набор инструкций процессоров 8086/8088 можно рассматривать как состоящий из двух уровней: ассемблерный уровень и машинный уровень. Ассемблерный уровень включает в себя около 100 инструкций. Например, только инструкция MOV способна пересылать содержимое регистра или ячейки памяти или непосредственное значение в регистр или ячейку памяти. Процессор распознает 28 различных инструкций для MOV (пересылка байта из регистра в память, пересылка непосредственно представленного слова в регистр и т. д.). Ассемблер транслирует написанные программистом инструкции ассемблерного уровня в инструкции машинного уровня, которые непосредственно выполняются процессором 8086 или 8088. Компиляторы языков высокого уровня транслируют предложения своего языка также в инструкции машинного уровня.
Наличие двух уровней инструкций направлено на удовлетворение двух различных требований: эффективности программы и относительной простоты программирования. Набор инструкций машинного уровня (их около 300) позволяет эффективно использовать память. Например, машинная инструкция, предназначенная для увеличения на 1 операнда памяти, занимает 3–4 байта, т. к. она должна содержать адрес операнда. Для наращивания регистра эта информация не нужна, и инструкция может быть короче. Фактически процессор 8086/8088 имеет 8 различных инструкций наращивания 16-битового регистра, занимающих по 1 байту. Если программист будет использовать одну инструкцию для наращивания регистра, другую – для операнда памяти, выгода от компактных инструкций будет сведена на нет сложностью программирования. Инструкции ассемблерного уровня с точки зрения программиста проще. Программист кодирует одну форму инструкции INC, а ассемблер проверяет её операнд и решает, какую машинную инструкцию генерировать.
Настоящее руководство содержит описание способов кодирования, алгоритмов работы и воздействия на флаги процессора инструкций ассемблерного уровня. Весь набор инструкций разделён на 6 групп по функциональному признаку. Эти группы инструкций описаны в главах 2–7.
Глава 2 содержит описание инструкций пересылки данных, позволяющих выполнять перемещения данных всех типов, кроме память–память.
Глава 3 посвящена арифметическим инструкциям.
В главе 4 приведены описания инструкций обработки битов, позволяющих оперировать с данными на уровне битов. Сюда же включены инструкции сравнения.
Глава 5 содержит описание инструкций обработки строк, предназначенных для выполнения операций (в том числе сравнения) типа память–память.
Глава 6 описывает инструкции передачи управления, позволяющие организовывать в программе циклы и ветвления.
Глава 7 посвящена инструкциям управления процессором.
Общая сводка инструкций процессоров 8086/8088 приведена в Приложении.
При программировании на языке ассемблера пользователю постоянно приходится иметь дело с регистрами и флагами процессора. Набор регистров и флагов процессора 8088 описан в руководстве «Система программирования на макроассемблере MS-DOS. Часть 2. Введение в язык ассемблера», п. 3 и Приложение 2. В настоящем руководстве использованы те же обозначения регистров и флагов.
При описании форматов кодирования инструкций предполагается, что текст, состоящий из букв русского алфавита на регистре строчных букв, разделенных символом «-», обозначает нетерминальные элементы и при кодировании должен замещаться требуемыми по смыслу конструкциями. Терминальные элементы обозначены латинскими буквами заглавного регистра и знаками препинания.
Во избежание перегрузки текста излишними подробностями в настоящем документе не приводится точных форматов кодирования операндов инструкций. Большинство инструкций допускает довольно широкий спектр операндов как с точки зрения синтаксиса, так и с точки зрения семантики. В общем случае каждый операнд инструкции трактуется как выражение. Типы, синтаксис и структура выражений подробно описаны в руководстве «Система программирования на макроассемблере MS-DOS. Часть 2. Введение в язык ассемблера», п. 4. В настоящем документе приводятся лишь ограничения на общий вид выражения.
|