Вы здесь

Система команд процессоров 8088/8086

7 posts / 0 new
Последнее сообщение
bazuka
Система команд процессоров 8088/8086

Система команд процессоров 8088/8086
В предыдущем разделе показано, как локализовать операнды и передать их в процессор для обработки. В команде могут находиться операнды, адреса и смещения. Теперь мы познакомимся с самими командами. На рис. 15.7 показаны команды процессоров 8088/8086 длиной от одного до шести байтов.
Число байтов в команде зависит от того, что в ней содержится. Байты команды могут содержать код операции, режим адресации, смещение, адреса и данные.
Коды операций процессоров 8088/8086 имеют длину 8 бит, всегда находятся в первом байте и определяют выполняемую командой операцию, например MOVE (переслать), ADD (сложить), JUMP (перейти) и т.д. Второй байт, если он есть, определяет режим адресации в двух битах MOD и трех битах R/M.
Когда режим адресации определяет смещение, для него в команде выделяются один или два байта. В трехбайтовой команде третий байт содержит биты смещения. В командах длиной четыре, пять или шесть байтов для смещения можно отвести два байта. Процессор использует смещение для формирования 20-битового адреса, по которому находятся данные для программы. Код операции и режим адресации могут определять один или два байта непосредстве шых данных. В этом случае данные находятся вместо смещения или после него. Примеры размещения в командах кодов операций, режимов адресации, смещений и данных в .командах различной длины приведены на рис. 15.7.

Последовательности команд. Программа состоит из длинного списка рассмотренных выше команд, байты которых один за другим размещаются в памяти. Процессор обращается к байтам последовательно до перехода или другой передачи управления.
Память для процессоров 8088/8086 организована в 16-битовые слова. Имеется 16 линий данных D15 — DO. Однако допускается адресация байтов и слов. Программист должен знать организацию данных при адресации байтов, чтобы следить за линиями данных. Рассмотрим, где хранятся байты D15 — D8 и D7 — DO.
В компьютере с процессорами 8088/8086 байты с четными номерами хранят младшие биты данных D7 —DO, а нечетные байты — старшие биты данных D15 —D8. Когда программа адресует байт за байтом, шина данных действует как в 8-битовом компьютере, но при адресации четного байта для передачи его содержимого используются линии D7 —DO, а при адресации нечетного байта — линии D15 —D8.
Когда процессор действует как 16-битовый компьютер и обращается к 16 бит одновременно, ситуация с адресацией изменяется, так как процессор теперь обращается к двум байтам одновременно: четному и нечетному. После этого все 16 бит передаются по всем линиям D15 —DO шины данных. Таким образом, при обращении к байтам компьютер действует как 8-битовый, а при обращении к словам — как 16-битовый:
 

rate: 
No votes yet
bazuka

Команды. Фирма Intel подразделяет 135 команд на семь групп: команды передач данных, арифметические команды, логические команды, команды передачи управления, цепочечные команды, команды прерываний и команды управления процессором.
Команды используют все регистры процессоров 8088/8086. Мы уже говорили о регистрах общего назначения и сегментных регистрах, но не касались важного регистра флажков, который участвует в выполнении многих команд. При выполнении команды один или несколько флажков в этом регистре изменяют свои состояния.
В 16-битовом регистре флажков процессора 8086 задействовано 9 бит, а при появлении новых моделей вводились дополнительные флажки. Однако старые флажки в новых процессорах сохраняются.
Регистр флажков представлен на рис. 15.8. В нем имеются девять флажков:

Имена некоторых флажков напоминают имена флажков уже рассмотренного 8-битового процессора 6800. У них аналогичные функции и в процессорах 8088/8086, а особенно активны они в арифметических и логических командах. Подробнее с назначением флажков мы познакомимся, изучая команды.
Команды передач данных. Команды этой группы подразделяются на шесть подгрупп. При разработке программ на машинном языке применяются мнемонические слова (команды) MOV, PUSH, POP, XCHG, IN и OUT. Имеются семь разновидностей команды MOV. Такие команды в 8-битовых процессорах назывались командами загрузки и сохранения, а в процессорах 8088/8086 они объединены в одну команду MOV. Есть также другие команды загрузки и сохранения, которые дополняют команды MOV. В соответствии со структурой байтов в команде определяется направление передачи данных.
На рис. 15.9 показано семь форматов команды MOV. Как видно из этого рисунка, допускаются самые разнообразные передачи. Например, четвертая команда определяет передачу данных из памяти в аккумулятор, а пятая команда почти с аналогичным форматом определяет передачу в другом направлении — из аккумулятора в память. В соответствии с командой можно передать 8 или 16 бит.

Команды PUSH и POP (рис. 15.10) работают только с 16-битовыми данными, включая в стек (push) или извлекая из стека (pop). Стек — это набор выделенных регистров в ЗУПВ, в которых сохраняется содержимое регистров процессоров 8088/8086, когда они обслуживают прерывания.

bazuka

Команда обмена XCHG (рис. 15.11) оперирует 8- или 16-битовыми данными и проводит обмен содержимого двух регистров, которые могут находиться в памяти или в процессоре. Обмен бывает между регистрами процессора или между регистром и ячейкой памяти. Невозможно обменять содержимое двух ячеек памяти.
Команды IN (ввода) и OUT (вывода), также показанные на рис. 15.11, предназначены для передач данных между регистром-аккумулятором и периферийными устройствами, т.е. являются команда ввода-вывода.

На рис. 15.12 приведены восемь команд, не вошедшие ни в одну из рассмотренных групп. Команда XLAT преобразует байт из младшего байта регистра-аккумулятора. Она передает содержимое регистра из таблицы в младший байт аккумулятора, что удобно при программировании. Далее идут четыре команды загрузки и одна команда сохранения, которые дополняют команду MOV. Команда LEA загружает эффективный адрес в указанный регистр. Команды LDS и LES загружают в сегментный регистр данных и дополнительный сегментный регистр 16-битовые данные из памяти. Команда LAHF загружает старший байт аккумулятора из регистра флажков, а команда SAHF сохраняет старший байт аккумулятора в регистре флажков.
Последние две команды передач данных PUSHF и POPF работают со стеком в ЗУПВ. Буква F в мнемонике показывает, что операция связана с регистром флажков. Команда PUSHF включает 16-битовое содержимое регистра флажков в стек, а команда POPF извлекает из стека в регистр флажков.
Арифметические команды. Рассмотренные выше команды осуществляют передачи 8- или 16-битовых данных из одного места в другое. Арифметические команды также пересылают данные, но основное их назначение — выполнять арифметические операции.
В процессорах 8088/8086 есть команды для сложения, вычитания, умножения и деления. Это представляет значительный шаг вперед по сравнению с 8-битовыми процессорами, которые могут только складывать, а вычитание, умножение и деление выполняют громоздкими средствами.
На рис. 15.13 приведены десять команд для сложения: три для сложения ADD, три — сложения с переносом ADC и две — инкремента INC. Все они оперируют байтами и словами. Команды ADD и ADC допускают в качестве операндов знаковые и беззнаковые числа. Команда ААА корректирует результат двоичного сложения десятичных ASCII-чисел, а команда DAA — двоичную сумму BCD-чисел.

Команды вычитания представлены на рис. 15.14 и 15.15. Пять из них являются прямыми двойниками команд сложения: вычитание SUB, вычитание с заемом SBB, декремент DEC, ASCII-коррекция после вычитания AAS и BCD-коррекция после вычитания DAS. Есть также команда изменения знака NEG и сравнения СМР (эта команда вычитает, устанавливает флажки, но не изменяет операнды). Команды сложения и вычитания оперируют 8-битовыми байтами, 16-битовыми словами и большими числами.
На рис. 15.16 показаны три команды умножения. Команда MUL выполняет простое умножение беззнаковых байтов и слов, а команда IMUL умножает знаковые числа. Наконец, команда ААМ корректирует двоичное произведение ASCII-чисел.
Есть также три команды деления. Команда DIV делит беззнаковые, а команда IDIV знаковые числа. Команда AAD работает с ASCII-числами. Команды умножения допускают 8- и 16-битовые сомножители, давая произведения длиной 16 или 32 бита. Команды деления воспринимают 16- или 32-битовое делимое и формируют 8- или 16-битовое частное.
Все арифметические команды воздействуют на отдельные биты регистра флажков. Расположение и функции флажков показаны на рис. 15.8. После выполнения команды флажки устанавливаются или сбрасываются в соответствии с результатом операции. Некоторые флажки, например переноса нуля, разрешения прерываний и переполнения, функционируют так же, как в 8-битовых процессорах. Флажки направления, покомандной работы и паритета являются новыми. Для программирования на машинном языке вам придется изучить смысл каждого из флажков, так как они играют важную роль. Процессоры 8088/8086 принимают множество решений по состояниям флажков.

bazuka

Логические команды. Помимо арифметических операций, АЛУ процессоров 8088/8086 может выполнять логические операции. Они представлены операциями AND, OR, NOT, XOR и TEST, которые реализуются командами, приведенными на рис. 15.17. Все команды оперируют байтами и словами и аналогичны соответствующим командам 8-битовых процессоров, но могут работать с 16-битовыми данными. Имеется единственная команда NOT и по три команды для логических операций AND, OR и XOR. На рис. 15.18 показаны три операции сдвига и четыре операции циклического сдвига.
Команда TEST аналогична соответствующей команде 8-битовых процессоров, но работает с 16-битовыми данными. Она применяется для установки флажков при объединении операндов по И без изменения значений операндов. Все команды TEST устанавливают или сбрасывают флажки. Программист часто использует эту команду для проверки правильности изменений флажков при проведении арифметических и логических операций.
Команды передачи управления. Команды этой группы изменяют адрес команды, т.е. имеют дело с адресацией. Схемы программного счетчика начинают адресацию с нуля и автоматически инкрементируют на единицу для изменения адреса. Команда передачи управления останавливает автоматический инкремент и адресует совершенно другую ячейку памяти, отличную от арифметического порядка.
Имеется три разновидности команд передачи управления. К первой относятся 16 команд типа JUMP (табл. 15.3). Они обращаются к регистру флажков и в зависимости от состояний флажков либо игнорируют флажки, либо изменяют адрес. После изменения адреса памяти процессор продолжает автоматический инкремент' адреса. Все команды условного перехода действуют относительно текущего содержимого программного счетчика. Диапазон перехода составляет от — 128 до 4-127 байт.
Команда JUMP содержит смещение, но может указывать регистр, содержимое которого передается в сегментный регистр кода или указатель команды. Новые биты адреса образуют тот новый адрес, по которому переходит процессор.
Примером команды условного перехода служит команда JO перехода при переполнении. Флажок переполнения находится в бите 11 регистра флажков. При выполнении команда JO проверяет состояние бита 11. Если он установлен в единицу, команда заставляет процессор перейти по новому адресу, определенному в команде Если же бит 11 сброшен в нуль, процессор осуществляет простой инкремент адреса и игнорирует команду JO. Данное средство позволяет процессору принимать решения, т.е. он решает, переходить или нет в зависимости от регистра флажков.

bazuka

На табл. 15.3 показаны команды условного перехода, переходящие или не переходящие в соответствии с условием в регистре флажков. Имеется также группа команд безусловного перехода JUMP (рис. 15.19). Когда такая команда поступает в процессор, он переходит независимо от битов регистра флажков.
Еще две команды вызова CALL и возврата RET, изменяющие адрес независимо от состояний битов в регистре флажков, приведены на рис. 15.20. Они применяются для перехода к подпрограмме, находящейся в любой области памяти, а после ее выполнения — для возврата в основную программу.
Предположим, например, что в программе нужно несколько раз вычислять логарифмы чисел. Для этого нужно разместить где-то в памяти подпрограмму вычисления логарифма. Когда в программе требуется вычислить логарифм, вызывается (CALL) подпрограмма. После вычисления логарифма выполняется команда возврата RETurn и процессор переходит к команде, находящейся после команды CALL.
Последняя группа команд передачи управления связана с управлением итерациями. Итерация или цикл означает выполнение программного фрагмента несколько раз, поэтому команды этой группы имеют мнемонику LOOP (цикл). Команда LOOP вновь и вновь выполняет одни и те же команды. В рассматриваемую группу входят три команды зацикливания (см. табл. 15.3) и специальная команда JUMP. Команды зацикливания работают совместно с регистром-счетчиком и декрементируют этот регистр на единицу. Простая команда LOOP при ненулевом счетчике заставляет процессор вернуться к команде внутри диапазона от — 128 до 4-127 байт. При каждом проходе по циклу счетчик уменьшается на единицу и управляет процессом зацикливания.

bazuka

Команда LOOPE/LOOPZ повторяет цикл после проверки флажка нуля Z и регистра-счетчика. Цикл повторяется, если они нулевые. Команда LOOPNE /LOOPNZ действует противоположным образом: она вызывает повторение цикла, когда флажок Z и счетчик ненулевые. Эти команды позволяют процессору войти в цикл, а затем выйти из него по достижении счетчиком нуля или возникновении другого условия нуль или не нуль.
Последняя команда JCXZ на табл. 15.3 также проверяет регистр-счетчик. Процессор переходит по новому адресу, когда счетчик содержит нуль. Команда JCXZ отличается от других команд условного перехода тем, что она проверяет регистр-счетчик, а не состояния флажков.
Команды манипуляции цепочками. Под цепочкой, или строкой, программист обычно понимает последовательность символов. Например, группа символов ABCDEF является цепочкой. В цепочках могут быть и числа, но при этом они считаются символами.
Процессоры 8088/8086 имеют шесть цепочечных команд (рис. 15.21). Обычно над цепочками выполняются простые операции. Примером служит конкатенация, или сцепление, цепочек, когда одна цепочка присоединяется к другой с образованием общей цепочки. Часто встречаются также операции поиска в цепочке другой подцепочки и замены одной подцепочки другой.
Цепочечные команды процессоров 8088/8086 позволяют пересылать, сравнивать и сканировать цепочки. Есть также команды для сохранения в цепочке содержимого регистра-аккумулятора и загрузки элементов цепочки в аккумулятор. Цепочечные команды оперируют двоичными наборами, которые могут представлять 6-битовый код BCD, 7-битовый код ASCII, 8-битовый код EBCDIC и т.д.
Пересылку цепочки осуществляет команда MOVS. Во всех цепочечных командах для адресации привлекаются регистры индекса источника SI и сегмента данных DS. Допускается также комбинация регистров SI/DS и DI/ES. Команда MOVS использует эти регистры для передачи цепочки из одной области памяти в другую. Она пересылает 8- или 16-битовый элемент, а затем инкрементируются или декремен-тируются регистры SI и DI на 1 или 2 в соответствии с кодом операции.
При необходимости передать несколько байтов или слов применяется команда повторения REP. Ее код операции помещается в память по адресу перед командой MOVS. При задании префикса REP команда MOVS повторяет себя столько раз, сколько определяет регистр-счетчик.
Команда сравнения цепочек CMPS сравнивает две цепочки байтами (словами). При этом инкрементируются или декрементируются регистры SI и DI. Перед командой сравнения, как и перед командой MOVS, можно поместить префикс повторения REP. В этом случае сравнение продолжается до тех пор, пока элементы цепочек одинаковы. Процессор прекращает операцию, как только элементы цепочек оказываются различными. Операция прекращается также при достижении нуля регистром-счетчиком.

bazuka

Команда сканирования цепочки SCAS действует примерно так же, как команда сравнения, но теперь сравниваются содержимое аккумулятора и элемент цепочки. При задании префикса повторения сравнение прекращается при достижении нуля в регистре-счетчике.
Последние две команды LODS (загрузка аккумулятора из цепочки) и STOS (сохранение аккумулятора в цепочке) довольно просты. С этими командами префикс повторения применяется редко.
Прерывания. В процессорах 8088/8086 есть три типа прерываний. Независимо от источника прерывания процессор начинает его обслуживание с одной и той же процедуры. Он включает в стек содержимое указателя команды IP, сегментного регистра кода CS и флажков. После этого процессор обращается к первому килобайту памяти, где хранится новое содержимое IP и CS. Выбор нужных значений проводится в зависимости от источника прерывания. Новое содержимое помещается в регистры IP и CS; оно образует адрес, по которому находится процедура обслуживания прерывания.
Команды прерывания INT, показанные на рис. 15.22, применяются для инициирования находящихся в памяти процедур обслуживания прерываний. Число таких процедур 256. Эти процедуры помогают периферийным устройствам взаимодействовать с процессором. Длина команд INT составляет два байта: первый байт содержит код операции, а второй определяет, какую процедуру выбрать для обслуживания прерывания.

В первом килобайте памяти (адреса 000 —3FF) находится таблица векторов прерываний, содержащая значения (векторы), которые помещаются в регистры IP и CS. После этого процессор адресует процедуру прерывания и выполняет ее (напомним, что исходное содержимое регистров IP и CS сохранено в стеке).
После выполнения процедуры прерывания процессор готов к возврату в основную программу, которую он выполнял до возникновения прерывания. Для такого возврата предназначена специальная команда возврата из прерывания IRET.
Однобайтовая команда IRET помещается в конце процедур прерывания. Она извлекает из стека содержимое регистров IP, CS и флажков и загружает его в регистры процессора. Таким образом, команда IRET возвращает процессор к той команде, которая выполнялась бы при отсутствии прерывания.
Однобайтная команда прерывания при переполнении INTO позволяет процессору прервать самого себя. Прерывание возникает при переполнении. Вектор этого прерывания находится по адресу 01 Oh.
Команды управления процессором. В последнюю группу входят команды для управления процессором. Большинство из них являются однобайтными командами, которые устанавливают или сбрасывают биты регистра флажков: CLC (сброс переноса), STC (установка переноса), CLI (сброс прерывания) и др. (рис. 15.23).
Последние четыре команды применяются для внешней синхронизации. Иногда желательно остановить процессор командой HLT до появления прерывания или сброса. Иногда требуется ожидать активного сигнала на входе *TEST и для этого используется команда ожидания WAIT. Эти команды предназначены для программистов и редко применяются специалистами по аппаратным средствам, но о них нужно знать.
Команда ESC (переключение на внешнее устройство) полезна в тех ситуациях, когда процессоры 8088/8086 должны работать с другими процессорами. Команда LOCK (префикс блокировки шины) применяется при необходимости выбрать специальный регистр.
Если вы захотите поглубже изучить машинные команды, вам следует приобрести одну из многочисленных книг по процессорам 8088/8086. Приведенное выше описание команд кратко знакомит вас с тем, как работают эти процессоры.