Формат и разновидность команд микропроцессора.
Все выполняемые микропроцессором операции кодированы в виде двоичных чисел. В современных процессорах CISC (персональные компьютеры) число команд (инструкций) достигает несколько сотен. В общем случае команда имеет следующий формат:
Префикс – уточняет или модифицирует действие команды.
Код операции – определяет действие данной команды.
Режим адресации – определяет используемую форму адреса операнда.
Масштаб-индекс-база – расширяет возможности адресации операндов.
Смещение – значение эффективного адреса операнда.
Операнды – указывают данные, над которыми нужно выполнить действие и место, куда надо поместить результат.
Из рисунка видно, что размер команды может меняться от 1 байта до 16 байт.
Способ указания операндов называется способом адресации. От разнообразия способов адресации зависит скорость исполнения команд и эффективность программы. В современных процессорах ПК используется несколько десятков способов адресации. Самыми основными из них можно выделить следующие варианты адресации:
- непосредственная адресация, операнд указывается непосредственно в команде в виде числа;
- прямая адресация, операнд указывается в команде регистром или адресом ячейки памяти;
- косвенная адресация, на операнд указывает число в регистре, обозначенном в команде;
- неявная адресация, операнд в команде не указывается, но подразумевается командой по умолчанию.
Для удобства программирования используется язык программирования ассемблер (язык низкого уровня). В этом языке командам сопоставляются некие сокращения слов, значащие действие команды. Программа на ассемблере представляет собой текстовый файл команд, оформленный по определенным правилам. Специальная программа транслятор-компилятор переводит текст с ассемблера в машинные коды, и готовить программу для процессора в виде исполняемого файла. Откомпилированные двоично-кодированные программы практически человеком не читаемы. Но используя программы отладчики можно сделать эти файлы читаемыми и просматривать действия этой программы по шагам.
Рассмотрим основные команды микропроцессоров, на примере некоторых базовых команд микропроцессоров ПК (Intel8086) используя язык ассемблер.
Команды пересылки данных:
MOV <приемник>,<источник> - пересылка данных. Копирование содержимого источника в приемник;
PUSH <источник> - запись в стек. Занесение слова в стек;
POP <приемник> - чтение из стека. Чтение слова из стека.
Стек – это область оперативной памяти организованная по принципу «первым вошел - последним вышел». В команде работы со стеком адрес источника или приемника не указывается, он выбирается автоматически и называется верхушкой стековой памяти. Стековые команды характеризуются быстрой записью и считыванием информации в область оперативной памяти.
Арифметические команды:
ADD <приемник>,<источник> - сложение. Сложение источника с приемником и запись результата в приемник;
SUB <приемник>,<источник> - вычитание. Вычитает из приемника значение источника и помещает результат в приемник;
CMP <приемник>,<источник> - сравнение. Выполняется сравнение вычитанием источника из приемника. Признаки операции формируются, но значения источника и приемника остаются неизменными.
MUL <источник> - умножение без знака. Если источник равен одному байту то источник умножается на содержимое регистра AL и результат помещается в AX. Если же источник равен машинному слову (два байта), то значение источника умножается на содержимое регистра AX и результат помещается в регистровую пару DX:AX;
DIV <источник> - деление без знака. Если источник – байт, то делимое в AX, делитель в <источник>, целая часть деления в AL, остаток в AH. В случае если источник равен двум байтам, в качестве делителя берется содержимое пары регистров DX:AX, результат от деления помещается в AX, остаток в DX;
INC <приемник> - инкрементирование. К содержимому приемника прибавляется единица;
DEC <приемник> - декрементирование. Содержимое приемника уменьшается на единицу.
Логические команды:
OR <приемник>,<источник> - логическое сложение. Выполняет поразрядную дизъюнкцию источника и приемника. Результат помещается в приемник;
AND <приемник>,<источник> - логическое умножение. Выполняет поразрядную конъюнкцию источника и приемника. Результат помещается в приемник;
NOT <приемник> - логическое отрицание. Все биты приемника инвертируются.
Команды условной и безусловной передачи управления:
JMP <адрес> - безусловный переход. Выполняет безусловный переход по указанному адресу. Адресом может быть определенная метка в программе или регистр, косвенно указывающий адрес;
J* <метка> - общий формат условной передачи управления. Имеется довольно много условий перехода. Наиболее часто используемые:
JG – переход, если больше;
JNG – переход, если не больше;
JL – переход, если меньше;
JNL – переход если не меньше;
JE – переход если равно;
JZ – переход если ноль.
Команды управления циклами:
LOOP <метка> - повторять до обнуления содержимого счетчика CX. Перед использованием команды LOOP необходимо в СХ занести число повторений. Команда LOOP уменьшает значение регистра CX на единицу и осуществляет переход на метку, если CX не равно нулю.
Команды работы с подпрограммами:
CALL <адрес> - вызов подпрограммы. Безусловная передача управления подпрограмме. Адресом может быть определенная метка в программе или регистр, косвенно указывающий адрес;
RET – возврат из подпрограммы.
Кроме рассмотренных нами операций, имеются:
- команды математического сопроцессора;
- команды обращения к внешним устройствам;
- команды работы со строковыми переменными;
- команды обслуживания и вспомогательные команды.
В 32 разрядных процессорах к базовым командам добавляются 32 разрядные команды, а к 64 разрядным процессорам еще добавляются команды работы с 64 битными данными.
Из-за ограниченности программы, на уровне данной дисциплины остальные команды рассматривать не будем.