Система команд i8086Система команд i8086 и, вообще, всего семейства x86 подробно описана в многочисленных справочниках и руководствах, например [11, 12, 13], поэтому далее мы кратко остановимся только на особенностях системы команд i8086, не вдаваясь в излишние подробности. (Страница156) i8086 отличается разнообразием форматов команд и способов адресации. Длина команды может составлять от 1 до 6 байтов, причем в первых двух байтах (иногда — в первом) определяется код операций, количество и длина операндов и способ их адресации. В остальных байтах команды могут размещаться непосредственный операнд, прямой адрес или смещение. Большинство команд i8086 являются двухадресными, причем один адрес определяет регистр процессора, а другой — ячейку памяти или регистр. Операнд в памяти может адресоваться прямо или косвенно посредством содержимого базовых (ВР, ВХ) или индексных (SI, DI) регистров, а также их суммы. Предусмотрены многочисленные варианты относительной адресации, при которых логический адрес образуется как сумма двух или трех слагаемых — одного или двух регистров процессора и 8- или 16-разрядного смещения, размещаемого в команде. Режимы адресации спроектированы с учетом эффективной реализации языков высокого уровня. Например, к простой переменной можно обратиться в режиме прямой адресации, а к элементу массива — в режиме косвенной адресации посредством ВХ, SI. Режим адресации через ВР предназначен для доступа к данным из сегмента стека, что удобно при реализации рекурсивных процедур и компиляторов языков высокого уровня. Система команд насчитывает 113 базовых команд, объединенных в следующие группы: □ команды передачи данных: • между регистрами и памятью (включая стек), обмен содержимым источника и приемника; • ввод, вывод, табличное преобразование; • загрузка исполнительного адреса в РОН, загрузка 4-байтового адресного объекта в регистры-указатели (начальный адрес сегмента и смещение в сегменте); • передача содержимого регистра F флагов в память, в стек и из стека; □ арифметические команды: • сложение, вычитание, умножение и деление двоичных чисел со знаком и без знака (произведение и делимое представляются числами двойной длины); • десятичная коррекция сложения и вычитания упакованных двоично-десятичных чисел; • десятичная коррекция сложения, вычитания, умножения и деления распакованных двоично-десятичных чисел; □ логические команды и сдвиги: • инверсия, конъюнкция, дизъюнкция, неравнозначность; • TEST — поразрядная конъюнкция операндов с установкой флагов, но без занесения результатов; • сдвиги на 1 или заданное число разрядов (константа сдвига располагается в CL); □ команды передачи управления: переходы, вызовы, возвраты имеют две разновидности — внутрисегментные ("близкие") и межсегментные ("дальние"). При близких передачах загружается только IP, при дальних — IP и CS. Передачи управления могут быть прямыми (целевой адрес — в команде) или косвенными (целевой адрес вычисляется с использованием стандартных режимов адресации). В 16 командах условных переходов проверяются отношения знаковых и беззнаковых чисел. Имеются 4 команды управления циклами, которые рассчитаны на размещение числа повторений цикла в регистре СХ; □ команды обработки цепочек данных манипулируют последовательностями байтов или слов в памяти. Время обработки цепочек этими командами гораздо меньше, чем соответствующей программной реализацией.
|