Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
118
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
САМАРСКИЙ ГОСУДАРСТВЕННЫЙ АЭРОКОСМИЧЕСКИЙ УНИВЕРСИТЕТ
СИСТЕМНОЕ ПРОГРАММИРОВАНИЕ
КУРС ЛЕКЦИЙ ДЛЯ СТУДЕНТОВ ЗАОЧНОГО ФАКУЛЬТЕТА
САМАРА
2002
УДК 681.3
Системное программирование: Курс лекций / О.П. Солдатова, С.В. Востокин. Самар. гос. аэрокосм. ун-т. Самара, 2002. С. 127.
ISBN 5-7883-0118-1
Дано описание архитектуры и системы команд реального режима работы микропроцессоров фирмы INTEL. Дано описание архитектуры и системы команд устройства с плавающей точкой (FPU). Приведены варианты заданий контрольных работ по курсу и примеры программ.
Курс лекций предназначен для студентов заочной формы обучения специальности 22.02 «Автоматизированные системы обработки информации и управления». Данный курс лекций будет также полезен студентам других специальностей, знакомых с основами архитектуры микропроцессоров фирмы INTEL и занимающихся как по очной, так и заочной форме обучения. Работа подготовлена на кафедре ИСТ.
Печатается по решению редакционно-издательского совета Самарского государственного аэрокосмического университета имени академика С.П. Королева.
Рецензент канд. техн. наук, доц. Л.А. Ж а р и н о в а
ISBN 5-7883-0118-1 Солдатова О.П., Востокин С.В., 2002
Самарский государственный
аэрокосмический университет, 2002
Содержание
[1] 1.ВВЕДЕНИЕ В АРХИТЕКТУРУ ЭВМ.
[2] [2.1] 2.1.Форматы данных микропроцессора [2.1.1] 2.1.1.Числа [2.1.2] 2.1.2.Символы [2.1.3] 2.1.3.Указатели [2.1.4] 2.1.4.Цепочки [2.2] 2.2.Адресация памяти [2.2.0.1] 2.5.1.2. Команды PUSH и POP . [2.2.0.2] 2.5.1.4. Адресные команды (пересылки адреса) [2.2.0.3] 2.5.1.5. Флажковые команды (команды пересылки флагов). [2.2.0.4] 2.5.2.2.Команды вычитания. [2.2.0.5] 2.5.2.3.Команды умножения и деления. [2.2.0.6] 2.5.2.4.Команды расширения знака. [2.2.0.7] 2.5.3.1.Булевы команды. [2.2.0.8] 2.5.3.2.Команды сдвигов. [2.2.0.9] 2.5.3.3.Команды циклических сдвигов. [2.2.0.10] 2.5.3.4.Команды двойного сдвига [2.2.0.11] 2.5.4.1.Команды безусловной передачи управления. [2.2.0.12] 2.5.4.3.Команды SetCondition [2.2.0.13] 2.5.5.1.Команды пересылки цепочки. [2.2.0.14] 2.5.5.2.Команды сравнения цепочек. [2.2.0.15] 2.5.5.3.Команды сканирования цепочек. [2.2.0.16] 2.5.5.4.Команды загрузки. [2.2.0.17] 2.5.5.5.Команды ввода и вывода цепочек. [2.2.0.18] 2.5.5.6.Замена сегмента. [2.2.0.19] 2.5.6.1.Команды управления флагами. [2.2.0.20] 2.5.6.2.Команды синхронизации. [2.2.0.21] 2.5.6.3.Команда холостого хода. [2.2.0.22] 2.5.6.4.Команды прерываний. [3] 3.ДИРЕКТИВЫ И ОПЕРАТОРЫ АССЕМБЛЕРА [3.1] 3.1.Структура программы [3.2] 3.2.Организация программы. [3.2.1] 3.2.1. Модели памяти
[3.2.2] [3.2.3] 3.2.3. Директивы задания набора допустимых команд [3.3] 3.3.Примеры использования директив в программах типа .EXE и .COM.
[4] [4.1] 4.1.Форматы чисел сопроцессора [4.1.1] 4.1.1.`Целые числа [4.1.2] 4.1.2. Вещественные числа [4.1.3] 4.1.3.Диапазоны вещественных чисел в х87. [4.2] 4.2.Особые случаи вещественной арифметики [4.3] 4.3.Формирование специальных значений в особых случаях [4.3.1] 4.3.1. Случай неточного результата. [4.3.2] 4.3.2.Численное антипереполнение. [4.3.3] 4.3.3. Денормализованный операнд. [4.3.4] 4.3.4. Деление на ноль. [4.3.5] 4.3.5.Численное переполнение. [4.3.6] 4.3.6.Недействительная операция. [4.4] 4.4.Регистры математического сопроцессора. [4.4.1] 4.4.1.Численные регистры (регистровый стек). [4.4.2] 4.4.2.Регистр управления (cw) [4.4.3] 4.4.3.Регистр состояния. [4.4.4] 4.4.4. Регистр тэгов (признаков). [4.4.5] 4.4.5.Указатели особого случая. [4.5] 4.5.Система команд арифметического сопроцессора. [4.5.1] 4.5.1.Команды передачи данных. [4.5.2] 4.5.2.Арифметические команды [4.5.3] 4.5.3.Дополнительные арифметические команды [4.5.4] 4.5.4.Команды сравнений [4.5.5] 4.5.5.Трансцендентные команды [4.5.6] 4.5.6.Административные команды [4.6] 4.6.Совместная работа двух процессоров в системе. [4.6.1] 4.6.1.Синхронизация по командам. [4.6.2] 4.6.2.Синхронизация по данным. [5] 5.ВАРИАНТЫ КОНТРОЛЬНЫХ РАБОТ [5.1] 5.1.Контрольная работа №1 [5.2] 5.2. Контрольная работа №2 [6] 6.ПРИМЕРЫ ПРОГРАММ [7] СПИСОК РЕКОМЕНДУЕМОЙ ЛИТЕРАТУРЫ |
Структура персонального компьютера.
Под термином “Архитектура ЭВМ” - будем понимать представление о машине в терминах функциональных основных модулей, языка, структуры данных (без деталей их аппаратной реализации).
С точки зрения пользователя, можно выделить следующие группы характеристик, определяющие архитектуру ЭВМ:
Структура машинного кода и система команд, определяющие алгоритмические возможности процессора.
Технические и эксплуатационные характеристики ЭВМ: производительность, емкость памяти, тактовая частота, стоимость и т.д.
Состав и характеристики функциональных модулей базовой конфигурации ЭВМ, наличие возможности подключения дополнительных модулей.
Структура и состав системного программного обеспечения и принципы его взаимодействия с аппаратурой.
Структурная схема ПК приведена на рисунке 1.1.
Рисунок 1.1. Структурная схема ПК
Микропроцессор (МП) центральный блок ПК, предназначенный для управления работой всех блоков машины и для преобразования информации, то есть. выполнения арифметических и логических операций над информацией. Микропроцессор состоит из следующих схем:
Арифметико-логическое устройство (АЛУ) предназначено для выполнения всех арифметических и логических операций над числовой и символьной информацией, для ускорения операций с вещественными числами к АЛУ подключается математический сопроцессор.
Внутренние регистры служат для кратковременного хранения, записи и выдачи информации, непосредственно используемой в вычислениях в ближайшее время работы ПК. Регистры быстродействующие ячейки памяти различной длины (864 разрядов).
Устройство управления (УУ) формирует и подает на все блоки машины символы управления (управляющие символы); формирует адреса ячеек памяти и передает их для выполнения операции.
Интерфейс МП реализует сопряжение и связь с другими устройствами ПК; включает в себя связь между устройствами МП, буферные регистры, схемы управления портами ввода-вывода и системной шиной.
Интерфейс совокупность средств сопряжения и связи устройств компьютера, обеспечивающая их эффективное взаимодействие. Порт ввода-вывода аппаратура сопряжения, позволяющая подключить к микропроцессору другое устройство ПК.
Генератор тактовых импульсов генерирует последовательность электрических импульсов; синхронизирующих работу всех устройств ПК; частота генерируемых импульсов определяет тактовую частоту ПК, которая является одной из основных характеристик ПК.
Такт промежуток времени между соседними импульсами.
Системная шина основная интерфейсная система ПК.
Системная шина включает в себя:
шину данных, содержащую провода и схемы сопряжения для параллельной передачи всех разрядов числового кода операнда;
шину адреса, содержащую провода и схемы сопряжения для параллельной передачи всех разрядов числового кода адреса ячейки ОП или порта ввода-вывода внешнего устройства;
шину управления, содержащую провода и схемы сопряжения для передачи управляющих сигналов во все блоки ПК;
шину питания, имеющую провода и схемы сопряжения для подключения блоков ПК к системе электропитания.
Системная шина обеспечивает 3 направления передачи информации:
между МП и ОП;
между МК и портами ввода-вывода внешних устройств;
между ОП и портами ввода-вывода внешних устройств (в режиме прямого доступа к памяти).
Все блоки ПК (точнее их порты ввода-вывода) через соответствующие унифицированные разъемы подключаются к шине единообразно: непосредственно или через адаптеры.
Управление системной шиной осуществляется либо непосредственно, либо через контроллер шины. Обмен информацией между внешними устройствами и системной шиной выполняется с использованием ASCII-кодов.
Функции хранения информации выполняет память внутренняя и внешняя.
Основная память (ОП) предназначена для хранения и оперативного обмена информацией с другими блоками ПК. ОП состоит из ПЗУ и ОЗУ. В последнее время в состав ОП входят также КЭШ-память и FLASH- память
ПЗУ служит для хранения постоянной программной и справочной информации, позволяет оперативно только считывать хранящуюся в нем информацию (изменить информацию в ПЗУ нельзя).
ОЗУ предназначено для оперативной записи, хранения и считывания информации (программ и данных), непосредственно участвующей в информационно-вычислительном процессе, выполняемом ПК в текущий период времени.
Внешняя память используется для долговременного хранения любой информации, которая может когда-либо потребоваться. Во внешней памяти хранится все программное обеспечение ПК.
Источник питания блок, содержащий системы автономного и сетевого энергопитания ПК.
Таймер внутримашинные электронные часы, обеспечивающие автоматический съем значения текущего момента времени (год, месяц, день, часы, минуты, секунды и доли секунды).
Таймер подключается к автономному источнику питания аккумулятору и при отключении ПК от сети продолжает работать.
Внешние устройства (ВУ) обеспечивают взаимодействие ПК с окружающей средой: пользователями, объектами управления и другими ЭВМ.
ВУ разделяются на следующие классы:
внешние запоминающие устройства (ВЗУ);
устройства ввода информации;
устройства вывода информации;
средства связи и телекоммуникации.
Устройства ввода информации:
клавиатура;
графические планшеты (диджитайзеры) ручной ввод графической информации путем перемещения по планшету специального указателя (пера);
сканеры;
манипуляторы (джойстик рычаг, мышь, трекбол шар в оправе, световое перо для ввода графической информации на экран дисплея путем управления движением курсора по экрану);
сенсорные экраны для ввода отдельных элементов изображения, программ или команд в ПК;
устройство речевого ввода-вывода быстроразвивающиеся средства мультимедиа;
видеомонитор устройство для отображения вводимой и выводимой информации.
Устройства вывода информации:
принтеры печатающие устройства для регистрации информации на бумажный носитель.
графопостроители (плоттеры) устройства для вывода графической информации из ПК на бумажный носитель. Векторные плоттеры вычерчивают изображение при помощи пера. Растровые бывают электростатические, струйные и лазерные. По конструкции плоттеры подразделяются на планшетные и барабанные.
Устройства связи и телекоммуникации используются для связи с другими приборами и подключения ПК к каналам связи и другим ЭВМ и вычислительным сетям (сетевые интерфейсные платы, мультиплексоры передачи данных, модемы).
Сетевой адаптер служит для подключения ПК к каналу связи для работы в составе вычислительной сети. В глобальных сетях функции сетевого адаптера выполняет модулятор-демодулятор (модем).
Средства мультимедиа (multimedia многосредовость ) комплекс аппаратных и программных средств, позволяющих человеку общаться с ПК, используя самые разные , естественные для себя среды: звук, видео, графику, тексты, анимацию и др.
К средствам мультимедиа относятся: устройства речевого ввода-вывода, сканеры, высококачественные видео- и звуковые платы, платы видео-захвата (снимают изображения с видеомагнитофона или видеокамеры и вводят его в ПК), высококачественные акустические и видеовоспроизводящие системы с усилителями, звуковыми колонками, большими видео-экранами. К средствам мультимедиа относят также внешние запоминающие устройства большой емкости на оптических дисках, часто используемые для записи звуковой и видео информации.
Математический сопроцессор используется для ускоренного выполнения операций над числами с плавающей запятой. Имеет свою систему команд и работает параллельно с основным МП, но под его управлением. Последние модели МП, начиная с МП 80486DX, включают сопроцессор в свой состав в качестве устройства с плавающей точкой (FPU).
Контроллер прямого доступа к памяти освобождает МП от прямого управления НМД, что существенно повышает эффективность ПК.
Сопроцессор ввода-вывода за счет параллельной работы с МП значительно ускоряет выполнение процедур ввода-вывода при обслуживании нескольких внешних устройств, освобождая МП от обработки процедур ввода-вывода, в том числе реализует и режим прямого доступа к памяти.
Контроллер прерываний обслуживает процедуры прерывания, принимает запрос на прерывание от ВУ, определяет уровень приоритета этого запроса и выдает сигнал прерывания в МП. МП, получив этот сигнал, приостанавливает выполнение текущей программы и переходит к выполнению специальной программы обслуживания того прерывания, которое запросило ВУ. После завершения программы обслуживания восстанавливается выполнение прерванной программы. Контроллер прерываний является программируемым.
Конструктивно ПК выполнены в виде центрального системного блока, к которому через разъемы подключаются ВУ: дополнительная память, клавиатура, дисплей, принтер и т.д.
Системный блок обычно включает в себя системную плату (материнскую плату), блок питания, накопители на дисках, разъемы для дополнительных устройств и платы расширения с контроллерами-адаптерами ВУ.
На системной плате размещаются:
микропроцессор;
математический сопроцессор;
генератор тактовых импульсов;
блоки (микросхемы) ОЗУ и ПЗУ;
адаптеры клавиатуры, НЖМД, НГМД ;
контроллер прерываний;
таймер.
Микропроцессоры.
Микропроцессор (центральный процессор или CPU) функционально законченное программно-управляемое устройство обработки информации, выполненное в виде одной или нескольких больших (БИС) или сверхбольших (СБИС) интегральных схем.
Функции МП.
Чтение и дешифрация команд из ОП.
Чтение данных из ОП и регистров адаптеров ВУ.
Прием и обработка запросов и команд от адаптеров на обслуживание ВУ.
Обработка данных и их запись в ОП и регистры адаптеров ВУ.
Выработка управляющих сигналов для всех узлов и блоков ПК.
Разрядность шины данных МП определяет разрядность ПК в целом; разрядность шины адреса МП его адресное пространство.
Адресное пространство это максимальное количество ячеек ОП, которое может быть непосредственно адресовано микропроцессором.
Первый МП был выпущен в США в 1971 году фирмой Intel МП 4004. В настоящее время МП фирмы Intel и Intel-подобные являются наиболее популярными и распространенными.
Все МП можно разделить на 3 группы:
МП типа CISC (с полным набором команд);
МП типа RISC (с сокращенным набором команд);
МП типа MISC (с минимальным набором команд и весьма высоким быстродействием) находятся в стадии разработки.
Большинство современных ПК типа IBM PC используют МП типа CISC.
Основные модели процессоров фирмы INTEL приведены в таблице.
Модель МП |
Разрядность, бит |
Тактовая частота, МГц |
Адресное пространство, байт |
Число команд |
Число эл-тов |
Год выпуска |
|
Данных |
Адреса |
||||||
4004 |
4 |
4 |
4,77 |
4 10 |
45 |
2300 |
1971 |
8080 |
8 |
8 |
4,77 |
64 10 |
10000 |
1974 |
|
8086 |
16 |
16 |
4,77 и 8 |
10 |
134 |
70000 |
1982 |
8088 |
8, 16 |
16 |
4,77 и 8 |
10 |
134 |
70000 |
1981 |
80186 |
16 |
20 |
8 и 10 |
10 |
140000 |
1984 |
|
80286 |
16 |
24 (20) |
10-33 |
410 (410) |
180000 |
1985 |
|
80386 |
32 |
32 |
25-50 |
1610 (410) |
240 |
275000 |
1987 |
80486 |
32 |
32 |
33-100 |
1610 (410) |
240 |
1,210 |
1989 |
Pentium |
64 |
32 |
50-150 |
410 |
240 |
3,110 |
1993 |
Pentium Pro |
64 |
32 |
66-200 |
410 |
240 |
5,510 |
1995 |
Особенности некоторых процессоров:
Начиная с МП 80286 имеется возможность многозадачной работы и работы МП в вычислительной сети.
Начиная с МП 80386 используется конвейерное выполнение команд, что позволило увеличить быстродействие ПК в 2-3 раза, а также обеспечивается поддержка системы виртуальных машин, при которой в одном МП моделируется как бы несколько ПК, работающих параллельно и имеющих разные ОС.
МП Pentium это МП 80586(P5), товарная марка Pentium запатентована фирмой Intel. Эти МП имеют пятиступенчатую конвейерную структуру и КЭШ-буфер для команд условной передачи управления, позволяющие предсказать направление ветвления программы; по эффективному быстродействию они приближаются к RISC МП. Обмен данными с системой может выполняться со скоростью 1 Гбайт/с. У всех МП Pentium имеется встроенная КЭШ -память, отдельно для команд, отдельно для данных; имеются специализированные конвейерные аппаратные блоки сложения, умножения и деления, значительно ускоряющие выполнение операций с плавающей запятой.
В качестве примера на рисунке 1.2 приведена упрощенная структурная схема микропроцессора i486.
.
Рисунок 1.2. Упрощенная структурная схема микропроцессора i486.
В состав микропроцессора входят девять внутренних функциональных устройств, которые работают параллельно:
шинный интерфейс;
внутренняя кэш-память;
устройство предвыборки (опережающей выборки) команд;
устройство дешифрирования команд;
устройство управления;
целочисленное устройство;
устройство с плавающей точкой;
устройство сегментации;
устройство страничного преобразования адреса.
Сигналы внешней 32-битной шины процессора подаются во внутренние устройства через шинный интерфейс. Данные передаются из кэш-памяти в шинный интерфейс по 32-битной шине данных. Тесно связанные кэш-память и устройство предвыборки одновременно воспринимают выбранные с опережением команды из шинного интерфейса по 32-битной шине данных, которую кэш-память использует также для получения операндов. Находящиеся в кэш-памяти команды доступны устройству предвыборки, которое имеет 32-байтную очередь команд, ожидающих выполнения.
Когда внутренние запросы данных или команд можно удовлетворить из кэш-памяти, обращение к внешней шине процессора не производится.
Дешифратор команд преобразует команды в управляющие сигналы низкого уровня и точки входа в микрокод.
Устройство управления выполняет микрокод и управляет целочисленным устройством, устройством с плавающей точкой и устройством сегментации. Результаты вычислений помещаются во внутренние регистры целочисленного устройства и устройства с плавающей точкой или кэш-память.
Формирование адреса производят устройства сегментации и страничного преобразования (используется только в защищенном режиме работы процессора). Логические адреса преобразуются устройством сегментации в физические адреса для реального режима работы или в линейные адреса для защищенного режима работы процессора. В свою очередь линейные адреса передаются в устройство страничного преобразования и кэш-память по 32-битной шине адреса. Устройство страничного преобразования превращает линейные адреса в физические, которые направляются в кэш-память по 20-битной шине.
Микропроцессор работает с двоичными числами со знаком и без знака, длиной 8 бит (1 байт), 16 бит (2 байта) или 32 бита (4 байта), с двоично-десятичными числами длиной 8 бит (BCD - числа) и с десятичными числами длиной 8 бит.
Байт - это число без знака в диапазоне от 0 до 255 или число со знаком в диапазоне от - 128 до +127.
Слово - это число без знака в диапазоне от 0 до 65535 или число со знаком, то от - 32768 до +32767.
Для 32-разрядных процессоров определены операции над двойными словами. Двойное слово - это число без знака в диапазоне от 0 до 4294967295, или число со знаком в диапазоне от -2147483648 до +2147483647.
Для чисел со знаком старший бит является знаковым: для положительных чисел он равен нулю, а для отрицательных чисел - единице.
Отрицательные числа представлены в дополнительном коде, который получается путем инвертирования всех разрядов положительного числа и суммирования полученного кода с единицей в младшем разряде.
Микропроцессор может выполнять арифметические операции над двоично-десятичными числами, хранящимися в упакованном (2 цифры в байте) формате, и над десятичными числами в неупакованном (1 цифра в байте) формате. Упакованный формат предполагает, что байт содержит две десятичные цифры, занимающие старший и младший полубайты. Диапазон представимых чисел составляет от 0 до 99. В неупакованном формате байт содержит одну десятичную цифру, которая обычно кодируется в символьном коде ASCII. Цифра 0 код ируется как 30Н, а цифра 9 - как 39Н.
Символьные данные хранятся в стандартном символьном коде ASCII, каждый символ занимает 1 байт. Микропроцессор ничего не знает об ASCII-коде и рассматривает символьные данные как цепочки произвольных байтов, то есть последовательность кодов символов.
Указатели применяются для обращения к некоторым объектам в памяти, например адресам процедур или адресам меток. Близкий (NEAR) внутрисегментный указатель - это 16-битное или 32-битное смещение (в зависимости от разрядности микропроцессора) от базового адреса того сегмента, в котором находится указатель.
Далекий (FAR) межсегментный указатель применяется в тех случаях, когда программа осуществляет передачу управления в другой сегмент. Такой указатель определяет адрес сегмента и смещение внутри сегмента.
Микропроцессоры семейства 8086 могут оперировать цепочками(строками) байт, слов и двойных слов (32-разрядные процессоры). Под цепочкой понимается последовательность взаимосвязанных элементов, хранящихся по соседним адресам. Длина цепочки не может превышать длину сегмента. Система команд процессора имеет набор цепочечных примитивов, позволяющих эффективно работать с цепочками.
Микропроцессор делит адресное пространство на произвольное количество сегментов, каждый из которых содержит не более 64 Кб. Адрес первого байта сегмента всегда кратен 16 байтам и называется адресом сегмента (параграфом сегмента, номером сегмента). Для обращения к памяти внутри сегмента используется дополнительный адрес, называемый смещением, который указывает расположение байта относительно начала сегмента (относительный адрес или относительное смещение или исполнительный адрес). Адрес сегмента и смещение составляют логический адрес.
Физический адрес образуется с помощью объединения 16 разрядного адреса сегмента и 16 разрядного смещения. Если адрес сегмента сдвинуть влево на 4 бита и дополнить справа 4 нуля, то получится 20-разрядный базовый адрес сегмента. Если сложить базовый адрес сегмента с 16 разрядным смещением, то получится 20 разрядный физический адрес. Следовательно, адресуемая память составляет 220 байт = 1024 К = 1 М. Адрес сегмента - пятизначное шестнадцатеричное число, последняя цифра = нулю, так как адрес получается в результате умножения на 16. Смещение - четырехзначное шестнадцатеричное число. В памяти слово хранится в двух соседних байтах. Младший байт - младший адрес. Старший байт - старший адрес.
2.3.Внутренние регистры процессора
2.3.1.Регистры общего назначения
В микропроцессоре есть четыре 16-битных регистра общего назначения: AX, BX, CX, DX. Младший и старший байты регистров общего назначения доступны для работы и имеют свои уникальные имена: AL и AH, BL и BH, CL и CH, DL и DH соответственно. Регистры общего назначения в основном используются для временного хранения данных, особенно операндов арифметических операций. Данные регистры взаимозаменяемы, но тем не менее каждый из них имеет специальные функции:
AX - основной регистр, используемый в арифметических операциях над словом, также используется в операциях ввода/вывода и в некоторых операциях со строками.
AL - используется в аналогичных операциях над байтами, при преобразовании 10-х чисел и в операциях над ними.
AH - используется при умножении и делении байтов.
BX - используется при адресации данных.
CX - счетчик числа повторений циклов, номер позиции элемента данных при операциях сдвига и циклического сдвига на несколько битов.
DX - используется как расширение аккумулятора при операциях, дающих 32-разрядный результат и в операциях ввода/вывода.
Начиная с микропроцессора 80386, в дополнение к вышеперечисленным регистрам, существуют еще 32-разрядные регистры общего назначения EAX, EBX, ECX, EDX, младшим словом которых являются регистры AX, BX, CX, DX соответственно.
2.3.2.Сегментные регистры
Все сегментные регистры имеют размер 16 битов (слово).
CS - содержит адрес сегмента кода исполняемой программы.
SS - указывает на сегмент стека - область данных, предназначенную для временного хранения параметров и адресов, используемых программой.
DS - указывает на сегмент данных.
ES - указывает на дополнительный сегмент данных, используется при операциях с цепочками (если данные программы превышают 64 Кб).
Если программа не изменяет значения регистра CS, то размер ее кода не может превышать 64 Кб. Переключение адреса сегмента кода программы выполняется с помощью специальных команд JMP и CALL, когда управление передается на дальнюю метку или в дальнюю процедуру. Эти формы передачи управления неявно изменяют значение регистра CS и позволяют создавать программы любого размера.
Начиная с микропроцессора 80386, в дополнение к вышеперечисленным регистрам, существуют еще два регистра для адресации дополнительных сегментов данных FS и GS.
2.3.3.Регистры смещения
Микропроцессор содержит пять основных 16-битных регистров смещения:
SP и BP - содержат смещение в сегменте стека. SP-указывает на вершину стека, BP используется как базовый регистр для того, чтобы зафиксировать положение стека в какой-то момент времени и в дальнейшем адресоваться к данным, расположенным в стеке;
SI и DI в основном используются для формирования сложных адресов, состоящих из смещения начала блока данных в сегменте, и относительного смещения элемента данных внутри блока. При этом смещение начала блока обычно хранится в регистре BX или непосредственно в команде, а SI или DI задают смещение внутри блока. Кроме того, они участвуют в выполнении команд работы с цепочками;
IP - указывает на следующую выполняемую команду в сегменте кода, адрес ее хранится в CS. Программа не может явно получить или изменить значение этого регистра. Однако команды JMP и CALL неявно изменяют его значение, а также сохраняют его в стеке и восстанавливают из стека.
Начиная с микропроцессора 80386, в дополнение к перечисленным регистрам, существуют еще 32-разрядные регистры смещения ESP, EBP, ESI, EDI, EIP, младшее слово которых составляют регистры SP, BP, SI, DI и IP соответственно.
2.3.4.Регистр флагов
Для 16-разрядных микропроцессоров регистр флагов имеет размер 16 битов и использует в реальном режиме работы 9 флагов: 6-статусных флагов (отражают результаты арифметических и логических операций) и 3-управляющих флага (изменяют режим работы процессора).
Начиная с микропроцессора 80386 регистр флагов имеет размер 32-бита, но в реальном режиме используются тоже только 9 флагов из младшего слова:
CF - флаг переноса, указывает на арифметический перенос разряда. CF также может содержать значение бита, который при сдвиге или циклическом сдвиге вышел за границы регистра. CF=1, если перенос был (0 разряд).
PF - флаг четности, указывает на четность единичных разрядов в результате операции. Используется в основном в операциях обмена данными (2 разряд).
AF - вспомогательный флаг переноса, указывает на корректировку, необходимую при двоично-десятичных арифметических операциях (фиксирует факт переноса из младшего полубайта в старший полубайт). Упакованное число - 2 цифры в байте. В микропроцессоре нет десятичного сумматора. Сложение и вычитание десятичных чисел производится как сложение и вычитание двоичных чисел. Результат может быть неверным десятеричным числом, поэтому существуют команды преобразования результата в правильное десятеричное число. Чтобы это сделать, надо знать, был ли перенос (4 разряд).
ZF - флаг нуля. Указывает на нулевой результат или равенство при сравнении (6 разряд).
SF - флаг знака. Указывает на отрицательный результат в арифметической операции, логической, операциях сдвига или циклического сдвига (7 разряд).
OF - флаг переполнения. Указывает на арифметическое переполнение при операции (выход за пределы допустимых значений) (11 разряд).
TF - флаг трассировки (ловушки). Управляет одношаговыми операциями (при использовании отладчика), генерируя программные прерывания в конце каждой команды (8 разряд).
IF - флаг прерываний. Управляет разрешением и запретом прерываний от внешних устройств. Блокирует все прерывания, за исключением немаскируемых прерываний (NMI) (9 разряд).
DF - флаг направления. Управляет направлением влево и вправо в операциях со строками. При DF=1 микропроцессор уменьшает на 1 содержимое регистров индекса SI и DI после выполнения команды, а при DF=0 увеличивает на 1 содержимое регистра индексов (10 разряд).
Регистр флагов не имеет имени, однако, часто 16-разрядный регистр флагов называют FLAGS, а 32-разрядный регистр флагов - EFLAGS.
Формат 16-разрядного регистра флагов
16 |
11 |
10 |
9 |
8 |
7 |
6 |
4 |
2 |
0 |
||||||
OF |
DF |
IF |
TF |
SF |
ZF |
AF |
PF |
CF |
2.4.Режимы адресации
Обычно выделяют семь режимов адресации, которые определяют способ вычисления смещения адреса операнда :
Регистровая адресация.
Непосредственная адресация.
Прямая адресация.
Косвенная регистровая адресация.
Базовая адресация.
Прямая адресация с индексированием.
Базовая адресация с индексированием.
2.4.1.Регистровая адресация.
При таком способе адресации значения операндов содержатся в регистрах. Допускаются операции с любыми регистрами, кроме регистра IP. Регистр CS не может являться операндом - приемником.
Примеры использования регистровой адресации:
MOV AX, CX
ADD AX, BX
2.4.2.Непосредственная адресация
При таком способе адресации операндом - источником является непосредственное значение (константа).
Пример использования непосредственной адресации:
MOV CX, 5 или K EQU -8
MOV CX, K
2.4.3.Прямая адресация
При прямой адресации смещение адреса операнда (исполнительный адрес) содержится в самой команде, например:
.data
T DB 3
.code
MOV AL, T
Т - имя ячейки памяти , значение которой загружается в регистр AX.
2.4.4.Косвенная регистровая адресация
В данном случае регистр содержит не значение операнд, а его смещение в памяти. При этом для адресации операнда могут использоваться регистры BX, DI и SI, если операнд берется из сегмента данных (DS). Регистр ВР используется для косвенной адресации, если операнд находится в сегменте стека (SS). При использовании команд работы с цепочками регистр DI всегда адресует операнд в дополнительном сегменте памяти (ES).
Начиная с микропроцессора 80386 для косвенной регистровой адресации могут быть использованы все 32-разрядные регистры общего назначения: EAX, EBX, ECX, EDX.
Примеры использования косвенной регистровой адресации:
MOV AX,[BX].
Смещение адреса может быть загружено в регистр при помощи операции OFFSET, а адрес сегмента - операцией SEG.
MOV BX, OFFSET T
MOV DS, SEG T
Если требуется, можно изменить адрес сегмента ячейки памяти, используя префикс сегмента, например:
MOV AX, ES:[BX] - пересылает в AX операнд, адрес которого складывается из содержимого регистров ES и BX.
2.4.5.Базовая адресация
При этом способе адресации смещение адреса операнда образуется как сумма:
[BX] + сдвиг, если операнд в сегменте данных(DS);
[BP] + сдвиг, если операнд в стеке (SS).
Базовый адрес массива (записи) помещается в регистр BX или BP, а сдвиг указывает на элемент относительно базы. Для доступа к разным записям или к элементам разных массивов внутри массива достаточно только перегрузить регистр BX (BP).
Примеры базовой адресации:
MOV AX, [BX] + 4
MOV AX, [BX + 4].
2.4.6.Прямая адресация с индексированием
При такой адресации смещение адреса операнда образуется как сумма значений смещения ячейки памяти и смещения в регистре SI или DI. Данный способ используется для доступа к массивам данных. Например:
.data
T DB 6, 5, 4, 3
MOV DI, 3
MOV AL, T[DI] - Загружает в AL 3-й элемент массива T, т.е. 4.
При операциях со строками регистр DI по умолчанию указывает на дополнительный сегмент данных (CS).
2.4.7.Базовая адресация с индексированием
Смещение адреса операнда образуется как сумма трех компонент:
BX + SI + сдвиг или BX + DI + сдвиг, если операнд находится в основном сегменте данных (DS),
BP + SI + сдвиг или BP + DI + сдвиг, если операнд находится в сегменте стека (SS).
Удобен для адресации двумерных массивов, когда BX или BP содержат смещение адреса начала массива, а в индексных регистрах и сдвиге - индексы элементов по строке и столбцу, например:
MOV AX, [BX + DI + 2]
MOV AX, [DI + BX + 2]
MOV AX, T[DI][SI]
2.5.Система команд микропроцессора
Система команд микропроцессора обычно делится на семь групп команд:
Команды пересылки данных.
Арифметические команды.
Логические команды или команды манипулирования битами.
Команды передачи управления.
Команды обработки строк (цепочные команды).
Команды управления процессором.
Команды прерывания.
2.5.1.Команды пересылки данных.
Перечень команд пересылки данных приведен в таблице 2.1.
Таблица 2.1. Перечень команд пересылки данных.
Мнемоника команды |
Описание команды |
Общие |
|
MOV (переслать) |
источник - приемник |
MOVSX (c м/п 80386) |
источник - приемник |
MOVZX ( c м/п 80386) |
источник - приемник |
XCHG (обменять) |
источник - приемник |
PUSH (включить в стек) |
источник - стек |
POP (извлечь из стека) |
стек - приемник |
PUSHA (включить в стек все) |
регистры - стек |
POPA (извлечь из стека все) |
стек - регистры |
XLAT (преобразовать) |
M[AL] > AL |
Аккумуляторные (ввода-вывода) |
|
IN (ввести) |
Порт AL или AX |
OUT (вывести) |
AL или AX порт |
XLAT (преобразовать) |
f(AL) AL |
Адресные |
|
LEA (смещение) |
Смещение источника регистр |
LDS (загрузить полный адрес в регистр DS) |
Источник, источник + 1 регистр |
Источник + 2, источник + 3 DS |
|
LES (загрузить полный адрес в регистр ES) |
Источник, источник + 1 регистр |
Источник + 2, источник + 3 ES |
|
LSS (c м/п 80386) |
|
LFS (c м/п 80386) |
|
LGS (c м/п 80386) |
|
Флажковые |
|
LAHF (загрузить флажки в AH) |
SF, ZF, AF, PF, CF AH |
SAHF (запомнить AH во флажках) |
AH SF, ZF, AF, PF, CF |
PUSHF (включить в стек флажки) |
Флаги стек |
POPF (извлечь из стека флажки) |
Стек флаги |
2.5.1.1. Общие команды.
Команда MOV - переслать данные, основная команда группы.
Команда MOV осуществляет пересылку байт, слов или двойных слов.
Форматы команды MOV приведены в таблице 2.2.
Таблица 2.2. Форматы команды MOV.
Передача данных |
Слово |
Байт |
Регистр в регистр |
MOV AX, BX |
MOV AH, BH |
Операнд в регистр или память |
MOV CX, 850 |
MOV BL, 35 |
MOV PW, 850 |
MOV PB, 35 |
|
Память в регистр |
MOV DX, PW |
MOV CL, PB |
Регистр в память |
MOV PW, DX |
MOV PB, CL |
Регистр в сегментный регистр |
MOV ES, BX |
|
Сегментный регистр в регистр |
MOV AX, DS |
|
Сегментный регистр в память |
MOV PW, CS |
Исключения:
Нельзя пересылать данные из одной ячейки памяти в другую.
Нельзя загрузить в регистр сегмента операнд с непосредственной адресацией.
Нельзя переслать значение одного регистра сегмента в другой.
Нельзя использовать регистры CS и IP в качестве приемника в команде MOV.
Команды MOVSX и MOVZX - новые команды пересылки данных, введенные в систему команд микропроцессора 80386. Форматы команд:
, где
reg- только регистры общего назначения, mem - ячейка памяти.
MOVSX - пересылает данные и расширяет регистр знаковым разрядом операнда - источника,
MOVZX - пересылает данные и расширяет регистр нулями.
Команда XCHG - осуществляет обмен байт или слов. Один из ее операндов может быть в регистре или памяти, другой - в регистре. Различий между приемником и источником нет. Примеры использования команды прведены в таблице 2.3.
Таблица 2.3. Примеры использования команды XCHG.
Обмен данными |
Слово |
Байт |
Регистр с регистром |
XCHG CX, DX |
XCHG AL, AH |
Регистр с памятью |
XCHG BX, PW |
XCHG BL, PB |
Исключение:
Нельзя выполнить обмен значений регистров сегментов.
2.5.1.2. Команды PUSH и POP .
PUSH - передает слово из источника в стек, а команда POP осуществляет противоположное действие: передает слово из стека в приемник. Регистр SP содержит смещение последнего включенного в стек слова (вершину стека).
! Стек растет по направлению уменьшения адресов !
PUSH начинается с уменьшения содержимого SP на 2, а команда POP завершается увеличением содержимого SP на 2.
Операндами команд PUSH и POP могут быть сегментный регистр, несегментный (шестнадцатиразрядный) регистр или слово в памяти. Кроме того, в команде PUSH можно указывать непосредственный операнд, что не допускается в команде PUSH для процессора 8086. POP- не может содержать непосредственный операнд. Форматы команд приведены в таблице 2.4.
Таблица 2.4. Форматы команд PUSH и POP.
Операнд |
Включение |
Извлечение |
Регистр |
PUSH AX |
POP BX |
Память |
PUSH PW |
POP PW |
Сегментный регистр |
PUSH DS |
POP ES |
Непосредственный операнд |
PUSH 856 |
|
Все 16-битные регистры |
PUSHA |
POPA |
Все 32-битные регистры |
PUSHAD |
POPAD |
Исключение:
POP CS и POP IP - недействительные операции.
PUSHA и POPA являются эффективным средством для сохранения содержимого всех регистров (кроме сегментных и IP) в начале выполнения процедуры и восстановления их в конце работы. PUSHA включает в стек регистры в следующем порядке: AX, CX, DX, BX, SP, BP, SI, DI. Значение SP то, что было в нем до выполнения команды PUSHA. PUSHA уменьшает содержимое SP на 2 при включении в стек содержимого каждого регистра. POPA вызывает увеличение содержимого SP на ту же величину, что и PUSHA, ей не требуется запомненное в стеке содержимое регистра SP и она его просто уничтожает. Команды PUSHAD, POPAD работают аналогично с 32-битными регистрами процессора.
Команда XLAT - преобразует значение в регистре AL: она его заменяет на байт из таблицы, адресуемой регистром BX, причем индексом таблицы служит исходное содержимое регистра AL. Удобна для преобразования из одного кода в другой.
Пример использования команды для перевода цифр из 10 системы счисления в код “2 из 5” - любой код, содержащий 2 единичных бита.
Код “2 из 5” приведен в таблице.
Цифра |
Код |
0 |
11000 |
1 |
00011 |
2 |
00101 |
3 |
00110 |
~ |
~ |
9 |
10100 |
TABLE DW 11000B, 00011B, 00101B, 00110B, 01001B, 01010B, 01100B, 10001B, 10010B, 10100B, 11000B
MOV BX, OFFSET TABLE
MOV AL, 7
XLAT TABLE
2.5.1.3. Команды ввода-вывода.
Для связи с разными частями ЭВМ и управления ими микропроцессор использует порты ввода-вывода. Любой порт идентифицируется шестнадцатиразрядным номером порта в диапазоне от 0 до 65535. Как и при доступе к памяти, процессор для связи использует шины данных и адреса. При доступе к порту он посылает сначала по управляющей шине сигнал, который оповещает все устройства ввода-вывода, что адрес на шине является адресом определенного порта, а затем посылает сам адрес. То устройство, адрес порта которого совпадает, дает ответ. Номер порта - это адрес ячейки памяти, являющейся частью устройства ввода-вывода, а не частью основной памяти. Для указания на доступ к порту и пересылки информации к устройствам ввода-вывода и обратно, используются специальные команды ввода-вывода.
IN - передает данные (байт, слово или двойное слово ) из исходного порта в аккумулятор (AL, AX или EAX).
OUT - передает данные из аккумулятора в исходный порт.
Номер порта можно указывать либо в самой команде, либо в регистре DX(0-65535).
Примеры использования команд ввода-вывода приведены в таблице 2.5.
Таблица 2.5. Примеры использования команд ввода-вывода.
Команда |
Байт |
Слово |
Дв. Слово |
IN (непосредственная, операнд) |
IN AL, 20h |
IN AX, 20h |
IN EAX, 20h |
OUT(непосредственная, операнд) |
OUT 20h, AL |
OUT 20h, AX |
OUT 20h, EAX |
IN (регистр) |
IN AL, DX |
IN AX, DX |
IN EAX, EDX |
OUT(регистр) |
OUT DX, AL |
OUT DX, AX |
OUT EDX, EAX |
2.5.1.4. Адресные команды (пересылки адреса)
В микропроцессоре существуют три основные команды пересылки адреса: LEA, LDS, LES.
LEA - загрузить смещение в регистр. Форматы команды:
LEA
LDS -загрузить полный адрес в DS и регистр;
LES - загрузить полный адрес (указатель) в ES и регистр.
С микропроцессора 80386 в систему команд добавляются команды LSS, LFS, LGS, которые используются для загрузки полного адреса в регистр-приемник и регистры SS, FS, GS соответственно. Форматы команд LDS, LES, LSS, LFS, LGS:
Каждая из команд имеет два операнда - один в памяти, другой в 16-битном регистре или 32-битном регистре. Примеры использования команд:
LEA BX, MEMLOC=MOV BX, OFFSET MEMLOC
LDS CX, MEMLOC
LES DX, MEMLOC
LEA вычисляет 16-битное или 32-битное смещение операнда-источника и загружает его в любой 16-битный или 32-битный регистр общего назначения или в регистр смещения ( кроме IP). Она удобна для передачи смещения переменной в качестве параметра из одной процедуры в другую. В качестве операнда-источника в команде LEA может быть элемент массива, например: LEA BX, TABLE[DI].
LDS передает полный адрес операнда-источника в 16-битный или 32-битный регистр (любой регистр общего назначения) и в регистр DS.
HERE DB 100 |
== |
MOV BX, OFFSET HERE |
||
LDS BX, HERE |
MOV AX, SEG HERE |
|||
MOV DS, AX |
LES, LSS, LFS, LGS аналогичны LDS, но загружают адрес сегмента в регистры ES, SS, FS, GS соответственно.
Замечание: 32-разрядная адресация используется только в защищенном режиме работы микропроцессора. В реальном режиме работы команды используют только 16-битные регистры.
2.5.1.5. Флажковые команды (команды пересылки флагов).
Команды этого класса обеспечивают доступ к флагам процессора.
Команды LAHF (загрузить флаги в AH) и SAHF (запомнить AH во флагах). LAHF передает 5 флагов SF, ZF, AF, PF и CF в определенные биты регистра AH, а SAHF - реализует противоположную передачу. На рисунке 2.1 показано соответствие флагов разрядам регистра AH.
SF |
ZF |
AF |
PF |
CF |
флаги |
|||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
AH |
Рисунок 2.1. Соответствие флагов разрядам регистра AH.
Эти флаги выделены потому, что они были в микропроцессоре 8080. LAHF и SAHF предусмотрены в основном, для преобразования программ микропроцессора 8080 в программы микропроцессора 8086. Команда SAHF оказалась полезной при использовании арифметического сопроцессора для использования результатов расчета в команде условного перехода.
Существуют команды для пересылки содержимого регистра флагов в стек и обратно. Это команды PUSHF (включить в стек флаги) и POPF (извлечь из стека флаги). Рисунок 2.2 иллюстрирует работу этих команд.
Младшие адреса |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
SF |
ZF |
AF |
PF |
CF |
||||
NT |
IO |
PL |
OF |
DF |
IF |
TF |
||
Старшие адреса |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Рисунок 2.2. Размещение в стеке флагов после команды PUHF.
Начиная с микропроцессора 80386 добавляются команды PUSHFD и POPFD для 32-битного регистра EFLAGS.
PUSHFD- включает в стек 32-разрядный регистр флагов.
POPFD - извлекает из стека 32-разрядный регистр флагов.
2.5.2.Арифметические команды.
Перечень арифметических команд приведен в таблице 2.6.
Таблица 2.6. Перечень арифметических команд.
Мнемоника команд |
Описание команды |
Сложение |
|
ADD - сложение |
приемник + источник приемник |
ADC - сложить с переносом |
приемник + источник + CF приемник |
INC - увеличить на 1 |
приемник + 1 приемник |
. Вычитание |
|
SUB - вычесть |
приемник - источник приемник |
SBB - вычесть с займом |
приемник - источник - CF приемник |
DEC - уменьшить на 1 |
приемник - 1 приемник |
NEG - изменить знак |
0 - приемник приемник |
CMP - сравнить |
приемник - источник |
Умножение |
|
MUL - умножить |
AL * источник (8) AX |
AX * источник (16) DX, AX |
|
IMUL - умножить со знаком |
так же, как и в команде MUL, но операнды со знаком |
Деление. |
|
DIV - разделить |
AX/источник (8): целая часть AL, остаток AH |
[DX, AX]/источник (16): целая часть AX, остаток DX |
|
IDIV - разделить со знаком |
так же, как и в команде DIV, но операнды со знаком |
Команды расширения |
|
CBW - преобразовать байт в слово |
знаковый бит AL в AH |
CWD - преобразовать слово в двойное слово |
знаковый бит AX в DX |
CWDE - преобразовать слово в расширенное двойное слово |
знаковый бит AX в EAX |
CDQ - преобразовать двойное слово в учетверенное двойное слово |
знаковый бит EAX в EDX |
В арифметических командах устанавливаются или сбрасываются 6 флажков состояния:
CF - устанавливается, если операция дала беззнаковый результат вне диапазона (т.е. есть перенос в знаковый разряд). Заём (7,15,31) вызывает выход из разрядной сетки.
OF - устанавливается, если в операции получился знаковый результат, находящийся вне диапазона (т.е. перенос в знаковый разряд) не создаёт переноса из разрядной сетки или перенос из разрядной сетки происходит без переноса в знаковый разряд.
ZF - устанавливается, если результат операции (знаковый или беззнаковый) равен нулю.
SF - устанавливается, если старший бит результата операции содержит 1, показывая отрицательное число.
PF - устанавливается, если результат операции содержит четное число единичных битов.
AF - устанавливается, если в десятичных операциях требуется коррекция.
2.5.2.1. Команды сложения.
В системе команд существует три команды сложения: ADD, ADC, INC.
ADD - команда сложения, один из операндов которой может находиться в регистре или в самой команде (непосредственный операнд)
ADC - команда сложения с переносом, аналогична ADD, но использует в качестве третьего слагаемого начальное значение CF.
INC - команда увеличения на единицу, имеет один операнд. Прибавляет 1 к содержимому операнда и помещает результат в этот же операнд (не устанавливает флаг CF). INC идентична ADD с непосредственным операндом 1, но требует меньше байт в памяти.
Форматы команды ADD:
ADD reg/ mem, imn
ADD reg, reg/ mem
ADD mem/ reg, reg,
где reg - имя регистра, mem - имя ячейки памяти, imn - непосредственное значение размером 8, 16 или 32- разряда:
Начиная с микропроцессора 80386 введены следующие форматы:
ADD reg/ mem16, imn 8
ADD reg/ mem 32, imn 8 (расширение недостающих разрядов знаком).
2.5.2.2.Команды вычитания.
Команды вычитания SUB, SBB, DEC аналогичны командам ADD, ADC, INC, только производят операцию вычитания, а не сложения.
Команда CMP аналогична команде SUB, но результат не запоминается в приемнике, а устанавливаются только флаги в соответствии с результатом. CMP - это команда сравнения, после которой обычно следует команда условного перехода. Состояние флагов после выполнения команды CMP приведено в таблице 2.7.
Таблица 2.7. Состояние регистра флагов после выполнения команды CMP
Знаковые |
Беззнаковые |
|
приемник>источника |
ZF=0SF=OF |
CF=0ZF=0 |
приемникисточника |
SF=OF |
CF=0 |
приемник=источника |
ZF=1 |
ZF=1 |
приемникисточника |
ZF=1SFOF |
CF=1ZF=1 |
приемник<источника |
SFOF |
CF=1 |
Команда NEG изменяет знак своего операнда, то есть вычитает значение операнда-приёмника из 0 и тем самым формирует его дополнение до двух. Полезна для вычитания значения регистра или ячейки памяти из непосредственного значения.
Пример:
SUB 100, AL - запрещена
Можно сделать следующее:
NEG AL
ADD AL, 100
NEG - даёт дополнительный код операнда
2.5.2.3.Команды умножения и деления.
Умножение двух однобайтовых чисел может дать произведение длиной в слово. Аналогично умножение двух слов может дать результат длиной в двойное слово, а умножение двух двойных слов может дать результат длиной в учетверенное слово. Приведенный пример иллюстрирует данное утверждение.
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
8 бит |
||||||||
|
||||||||||||||||
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
8 бит |
||||||||
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
|||||||||
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
|||||||||
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
|||||||||
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
|||||||||
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
|||||||||
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
|||||||||
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
|||||||||
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
|||||||||
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
16 бит |
При умножении двух байтов командой MUL произведение будет находиться в регистрах AH (старший байт) и AL (младший байт), при умножении двух слов произведение будет находиться в регистрах DX (старшее слово) и AX (младшее слово), , а при умножении двух двойных слов произведение будет находиться в регистрах EDX и EAX.
Команда деления DIV делит 16-битовое число из регистра AX (или 32-битное число из регистров DX и AX, или 64-битное число из регистров EDX, EAX) на операнд половинного размера, определяемый в команде. Частное помещается в регистр AL (AX, EAX), а остаток в AH (DX, EDX). Для знаковых чисел требуются специальные команды умножения и деления (IMUL и IDIV).
Форматы команд умножения и деления приведены в таблице 2.8:
Таблица 2.8. Общие форматы команд умножения и деления.
Операнд |
Слово |
Байт |
AX (AL) с регистром |
КОП BX |
КОП CL |
AX (AL) с памятью |
КОП MEMW |
КОП MEMB |
КОП: MUL, IMUL, DIV, IDIV.
В микропроцессоре 80286 команда IMUL имеет ещё один дополнительный формат: разрешается определить множитель как непосредственный операнд. При этом множимое не обязательно должно быть в регистре AX (AL), а может находиться в любом шестнадцатиразрядном регистре или 16-битной ячейке памяти. Результат длиной только 16 бит допускается разместить в любом шестнадцатиразрядном регистре.
Примеры:
Слово в регистре IMUL DX, BX, 115; BX * 115 DX
Слово в памяти IMUL CX, MEMW, 632; MEMW * 632 CX
Начиная с микропроцессора 80386 добавляются следующие форматы команды IMUL:
Двухоперандные:
IMUL reg16, imn 8;
IMUL reg16, imn 16;
IMUL reg 32, imn 8;
IMUL reg 32, imn 32;
IMUL reg16, reg/ mem 16.
Cтаршая часть произведения теряется.
Трехоперандные:
IMUL reg 16, reg/ mem 16, imn 8/ 16;
IMUL reg 32, reg/ mem 32, imn 8/ 32.
Cтаршая часть произведения теряется.
Однооперандные:
Второй операнд и приемник в регистрах AL, AX, EAX.
IMUL reg/ mem (8/ 16/ 32-бита)
Команды умножения и деления действуют так, чтобы результат двойной длины при умножении можно было использовать в последующем делении. Если требуется поделить два числа одинакового размера, то в этом случае необходимо искусственно увеличить размер делимого. Если число без знака, то можно просто обнулить содержимое регистра AH, а если число со знаком, то 8-битное число должно быть преобразовано в 16-битное, 16-битное - в 32-битное и 32-битное в 64-битное. Для проведения операций расширения знака числа в микропроцессоре существуют специальные команды: CBW , CWD, CWDE, CDQ.
2.5.2.4.Команды расширения знака.
CBW преобразует байт в регистре AL в слово в регистре АХ путем расширения знакового бита AL во все биты регистра AH. Команда CWD преобразует слово в регистре АХ в двойное слово , расположенное в паре регистров DX, AX путем расширения знакового бита регистра AX во все биты регистра DX.
Новые команды расширения знака
Начиная с микропроцессора 80386, существуют еще две команды расширения знака CWDE и CDQ. CWDE преобразует слово в расширенное двойное слово путем расширения знакового разряда АХ во все старшие разряды регистра ЕАХ. CDQ преобразует двойное слово в регистре ЕАХ в учетверенное слово в паре регистров EDX, EAX путем расширения знакового разряда ЕАХ во все разряды EDX.
2.5.2.5.Десятичная арифметика.
До сих пор мы рассматривали арифметические операции под двоичными числами, так как компьютеры работают только с двоичными числами, но для людей более привычны десятичные числа. Поэтому возникает проблема преобразования десятичных чисел в двоичные. Можно десятичное число представить в двоичной системе полностью, кодом, например 37 - 00100101, а можно закодировать отдельно каждую цифру 3 и 7 и получить код 0011 0111. Такое двоичное изображение десятичных чисел называется двоично-десятичным кодированием (BCD - кодом). Для выполнения арифметических операций над числами в данном формате потребовалось бы ввести соответствующие команды сложения, вычитания, умножения и деления. Возможен и второй вариант: применить к таким числам команды двоичной арифметики, заранее зная о неправильном результате, а затем выполнить команду коррекции, которая сформирует правильный результат в BCD формате. Именно такой вариант был выбран в процессорах семейства 8086.
Рассмотрим сложение чисел 23 и 14 в BCD формате с помощью двоичного сложения:
0 |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
= |
25 |
|
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
= |
14 |
|
0 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
= |
37 |
Результат правильный, коррекция не нужна |
Сложим 29 и 14:
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
= |
29 |
|
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
= |
14 |
|
0 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
= |
3? |
Ответ неверен, так как код 1101 не соответствует десятичной цифре, требуется коррекция. |
Коррекция заключается в том, чтобы добавить 6 к сумме в тех разрядах, где получена запрещённая комбинация, компенсируя этим, 6 запрещённых комбинаций для десятичных чисел (4 разряда - 16 комбинаций, 10 цифр правильных, 6 - лишних).
0 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
= |
3? |
|
|
|
|
|
0 |
1 |
1 |
0 |
= |
06 |
|
0 |
1 |
0 |
0 |
0 |
0 |
1 |
1 |
= |
43 |
Результат правильный |
Более сложная ситуация возникает, когда сумма “проскакивает” запрещённый диапазон и становится допустимой цифрой.
Сложим 29 и 18:
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
= |
29 |
|
0 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
= |
18 |
|
0 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
= |
41 |
Результат неверный, так как младшая цифра проскочила запрещенный диапазон. |
При коррекции требуется добавить 6 и получить правильный результат 47. Однако необходимость такой коррекции невозможно определить по самому результату. Признаком “проскока” цифрой запрещённого диапазона служит перенос из соответствующего бита (разряда). В приведённом примере им будет перенос из младшего (десятичного) разряда в старший. Флаг CF показывает, что при сложении возник перенос из старшего бита (разряда), флаг вспомогательного переноса AF предназначен только для регистрации переноса из младшего 10-го разряда, зная который можно осуществить коррекцию. После сложения в нашем примере CF = 0 и AF = 1 (если CF = 1, то при следующем сложении надо учитывать его и сумму).
Десятичную коррекцию сложения осуществляет команда DAA, в которой предполагается, что сумма находится в регистре AL. С учётом содержимого AL и состояний флагов AF и CF команда DAA определяет необходимость коррекции и реализует её для AL.
Аналогично команда DAS корректирует результат после операции вычитания.
Для умножения чисел в формате BCD произвести коррекцию невозможно, так как в результате “замешаны” перекрёстные члены произведения. Аналогично и для команды деления. Следовательно, для умножения и деления необходимо перейти к другому представлению десятичных чисел. BCD формат называется упакованным, а в неупакованном формате байт содержит всего одну десятичную цифру. Она находится в 4-х младших битах, а старшие биты не влияют на значение цифры. Примером такого формата служит код ASCII, в котором символы представлены 8 битами. ASCII-коды десятичных цифр представлены в таблице 2.9.
Таблица 2.9. ASCII-коды десятичных цифр.
Цифра |
Код |
0 |
00110000 |
1 |
00110001 |
2 |
00110010 |
3 |
00110011 |
4 |
00110100 |
5 |
00110101 |
6 |
00110110 |
7 |
00110111 |
8 |
00111000 |
9 |
00111001 |
Четыре бита 0011 не влияют на значение цифры, однако, должны быть обнулены до выполнения арифметических операций.
Результаты двоичного сложения и вычитания ASCII-чисел можно скорректировать аналогично коррекции в BCD формате, причём корректируется только младшая цифра. В системе команд микропроцессора существуют специальные команды коррекции:
AAA - ASCII коррекция сложения.
AAS - ASCII коррекция вычитания.
AAM - ASCII коррекция умножения.
AAD - ASCII коррекция деления.
Пример: умножим 9 * 4, 9 - находится в регистре BL, а 4 - в регистре AL.
BL: 00001001 = 9 MUL BL - даёт в AX 16-битный результат, равный 36
AL: 00000100 = 4 36 = 0000 0000 0010 0100
Команда коррекции AAM должна “разложить” результат на 3 (00000011) в регистре AH и 6 в регистре AL. Для этого нужно просто раз делить содержимое AL на 10 и поместить частное в AH, а остаток в AL.
Поэтому команда AAM имеет длину 2 байта, так как второй байт - это представление 10. В рассмотренном примере старшие биты были нулевыми, иначе результат нельзя скорректировать. Поэтому перед умножением неупакованных десятичных чисел следует сбросить четыре старших бита в 0.
Рассмотрим деление неупакованных десятичных чисел, например 42/6. 42 находится в AL (0000 0100 в AH и 0000010 в AL), а 6 (00000110) в BL. Неупакованное представление одноразрядного числа 6 является его двоичным представлением, следовательно, нужно преобразовать 42 в двоичное число. Для этого AH следует умножить на 10 и сложить с содержимым регистра AL. Тогда при делении в AL получится число 7, двоичное представление которого совпадает с неупакованным представлением. Команда коррекции деления имеет свои особенности:
AAD - двухбайтовая команда (второй байт - 10).
Коррекция AAD предшествует делению, а в сложении, вычитании и умножении производится после операции.
Делимое и делитель (множимое и множитель) должны иметь 0 в старших 4-х битах.
2.5.3.Логические команды.
Перечень логических команд и их описание приведено в таблице 2.10.
Таблица 2.10. Перечень логических команд.
Мнемоника |
Описание |
|
Булевы команды |
AND (и) |
приемник и источник приемник |
TEST |
приемник и источник |
|
OR (или) |
приемник или источник приемник |
|
XOR (исключающее или) |
приемник источник приемник |
|
NOT (инверсия) |
не приемник приемник |
|
Команды |
SHL (логический сдвиг влево) |
CF приемник 0 |
сдвигов |
SHR (логический сдвиг вправо) |
0 приемник CF |
SAL (арифметический сдвиг влево) |
CF приемник 0 |
|
SAR (арифметический сдвиг вправо) |
знак приемник CF |
|
Команды циклических |
ROL (циклический сдвиг влево) |
|
сдвигов |
ROR (циклический сдвиг вправо) |
|
RCL (циклический сдвиг влево через перенос) |
||
RCR (циклический сдвиг вправо через перенос) |
||
Начиная с м/п 80386 дополнительные команды: |
||
Команды двойного сдвига |
SHLD (сдвиг с двойной точностью влево) |
|
SHRD (сдвиг с двойной точностью вправо) |
||
Команды работы с двоичными цепочками |
BT (поиск бита и запись его в CF) |
|
BTC (поиск и инвертирование бита в цепочке) |
||
BTS (поиск и установка бита в) |
||
BTR (поиск и сброс бита ) |
||
BSF (сканирование цепочки битов вперед) |
||
BSR (сканирование цепочки битов назад) |
2.5.3.1.Булевы команды.
К булевым командам относятся команды AND, OR, XOR, NOT, TEST.
Команды AND, OR, XOR выполняют логическую функцию над соответствующими битами источника и приёмника, помещая результат в приёмник. Все команды двухоперандные , разрешённые форматы операндов такие же, как у команд ADD, ADC, SUB, SBB.
Команда NOT - однооперандная, она выполняет инверсию каждого бита операнда и помещает результат в то же место. Формат команды такой же, как у команд DEC, NEG, INC.
Команда AND удобна для обнуления указанных разрядов числа: один операнд определяет разряды, а второй число. Например: обнуление старших 4-х битов в байте с именем MEMB (AND MEMB, 00001111B).
Команда OR используется для установки указанных битов, а команда XOR используется для инвертирования указанных разрядов в числе. XOR позволяет также сбросить содержимое регистра в нуль (регистр должен быть и источником и приёмником).
Команда TEST - двухоперандная, формат совпадает с командами ADD, ADC, SUB, SBB. Объединяет возможности команд AND и CMP, Как AND она выполняет объединение по “и” соответствующих бит операндов, как CMP она сохраняет только состояния флагов, а не результат. Удобна для проверки того, есть ли в указанных разрядах числа хотя бы одна 1. Один операнд определяет разряды, второй - число. Если результат неравен 0, то, по крайней мере, один разряд равен 1. Все логические команды кроме NOT изменяют флаги SF, ZF, PF. Флаг AF - не определён, а CF = 0 и OF = 0, DF, IF, TF - не изменяются.
2.5.3.2.Команды сдвигов.
Команды сдвигов являются эффективным средством увеличения или уменьшения числа в 2 раза (меньше памяти и быстрее, чем в командах умножения и деления). Для умножения числа на 2, надо сдвинуть все биты на 1 разряд влево, а в освобождённый правый бит поместить 0. Если выдвинутый слева бит передать во флаг CF, то можно зафиксировать выход за диапазон, проверив условие CF = 1. Аналогично уменьшение беззнакового числа вдвое осуществляется сдвигом всех бит на один разряд вправо, а в освобождающийся бит помещается 0. Вдвигаемый справа бит передаётся во флаг CF, если CF = 1, то число нечётное. С беззнаковыми числами работает команда SHL и SHR, а команды SAL и SAR предназначены для знаковых чисел. SAR сохраняет знаковый бит неизменным, команда SHR помещает в знаковый бит 0 (но заносит 1 во флаг OF, если знак имеется). Отметим, что сдвиг вправо нечётного числа всегда даёт результат, который меньше половины числа, например:
-5 (1111 1011) SAR -3 (1111 1101)
-3 < -2.5
При делении -5 на 2 командой DIV результат будет = -2. Различий между удвоением знакового и беззнакового чисел нет.
Рисунок 2.3.
Графическое представление работы команд сдвигов
2.5.3.3.Команды циклических сдвигов.
Команды циклических сдвигов позволяют переставить биты в числе. ROL - циклический сдвиг влево и ROR - циклический сдвиг вправо, обеспечивают циклический сдвиг. При этом выдвигающийся бит подаётся в освобождающийся бит. В командах RCL и RCR в кольцо сдвига включается флаг CF: выдвигающийся бит подаётся во флаг CF, а состояние флага CF передаётся в освобождающийся бит. Операнд команд сдвигов и циклических переносов может находиться в памяти или в регистре, длина операнда равна 8 или 16 бит. Сдвиг осуществляется на предопределённое число бит (фиксированный сдвиг). В первом случае число сдвигов определяется в команде, а во втором - содержимым регистра CL (счётчика). В микропроцессоре 8086 фиксированный сдвиг осуществляется только на 1 бит.
Примеры команд приведены в таблице 2.11.
Таблица 2.11. Примеры команд циклических сдвигов.
Операнд |
Слово |
Байт |
Фиксированный сдвиг |
||
Регистр |
КОП BX, 13 |
КОП DL, 1 |
Память |
КОП MEMW, 15 |
КОП MEMB, 7 |
Переменный сдвиг |
||
Регистр |
КОП AX, CL |
КОП BL, CL |
Память |
КОП MEMW, CL |
КОП MEMB, CL |
КОП: SHR, SHL, SAL, SAR, ROR, ROL, RCR, RCL.
Графическое представление работы команд циклических сдвигов приведено на рисунке 2.4.
Рисунок 2.4. Графическое представление работы команд циклических сдвигов
2.5.3.4.Команды двойного сдвига
Команды SHLD, SHRD введены в систему команд микропроцессора 80386. Предназначены для сдвигов двух 16-битных или двух 32-битных операндов. Форматы команд:
SHLD, SHRD reg/ mem 16, reg, imn
SHLD, SHRD reg/ mem 32, reg, imn, где
imn - непосредственное значение, которое определяет число сдвигов.
Внутри процессора два первых операнда объединяются в промежуточном регистре двойной длины, код которого сдвигается. После сдвига результат в приемнике, а источник не изменяется.
2.5.3.5.Команды работы с двоичными цепочками
Команды работы с двоичными цепочками введены в систему команд микропроцессора 80386 включают две группы :
1) Команда поиска бита ВТ выбирает бит в двоичной цепочке и передает его значение в CF. BTC- поиск и инвертирование бита в цепочке, BTS- поиск и установка бита, BTR- поиск и сброс бита. Форматы команд этой группы одинаковые, поэтому приведены только для команды BT:
BT приемник (двоичная цепочка), источник (номер бита в цепочке)
BT
2) Команды сканирования битов
BSF- вперед BSR- назад |
|
предназначены для поиска в слове или двойном слове позиции первого единичного бита |
Формат команд :
BSF,BSR приемник, источник
BSF,BSR
Приемник- номер первого единичного разряда.
Источник- битовая цепочка.
Результат исполнения команды фиксирует флаг ZF: ZF=0, если есть 1, и ZF=1, если источник равен 0 ( в этом случае приемник не определен).
2.5.4.Команды передачи управления.
2.5.4.1.Команды безусловной передачи управления.
К командам настоящей группы относятся команды переходов, вызовов (процедур) и возвратов (из процедур). Переходы загружают значение в указатель команды IP, нарушая тем самым последовательное выполнение команд. Вызовы выполняют то же самое, но в начале они запоминают текущее значение содержимого указателя IP в стеке, так что при возврате можно было возобновить выполнение программы с этой точки.
Переходы, вызовы и возвраты бывают двух видов - внутрисегментные и межсегментные. Первые из них передают управление внутри текущего сегмента кода, вторые - в произвольный сегмент кода (изменяя содержимое регистра CS), который становится текущим сегментом кода. Межсегментный вызов сохраняет в стеке текущее содержимое регистров CS и IP. Межсегментный возврат соответственно восстанавливает из стека содержимое регистров CS и IP. В случае внутрисегментного вызова и возврата в стеке сохраняется и восстанавливается только указатель команды IP. Отметим, что все вызовы одной и той же процедуры должны быть либо внутрисегментными либо межсегментными, так как при возврате из процедуры должно извлекаться из стека столько байт, сколько было включено в стек при вызове.
Команда CALL осуществляет вызов (межсегментный и внутрисегментный) а команда RET соответствующий ей возврат. Для того чтобы сообщить ассемблеру, какие типы вызовов и возвратов генерировать для процедуры, последнюю ограничивают операторами PROC и ENDP.
Например:
UPCOUNT PROC NEAR (FAR)
ADD CX, 1
RET
UPCOUNT ENDP
Так как процедура объявлена как NEAR, то вызов и возврат будут внутрисегментными, если бы мы объявили её как FAR, то вызов и возврат были бы межсегментными, и команда CALL загрузила бы в стек сначала содержимое регистра CS, а затем IP.
Команда JMP осуществляет внутрисегментные и межсегментные переходы. Для того чтобы указать, какой переход осуществить, необходимо указать тип метки перехода (NEAR или FAR). При внутрисегментном переходе команда JMP занимает 3 байта, а при межсегментном - 5 байт. Существует разновидность команды JMP для коротких внутрисегментных переходов (-128 +127 байт от адреса команды JMP). Она занимает в памяти 2 байта. Для определения такой команды следует указать, что её операнд имеет тип SHORT. Например, JMP SHORT LABEL1.
До сих пор мы рассматривали только прямые переходы и вызовы. Однако команды JMP и CALL могут осуществлять и косвенный переход или вызов через регистр или ячейку памяти. Если для косвенной передачи управления используется регистр, то в нём должно быть смещение процедуры или метки перехода относительно регистра CS (регистра кодов). Если для косвенной передачи управления используется ячейка памяти, то микропроцессор 8086 (80286) по умолчанию будет считать, что она содержится в сегменте DS (если не указан префикс смены сегмента или не используется регистр BP для адресации ячейки); если используется BP - то микропроцессор будет считать, что ячейка памяти находится в сегменте стека и адресуется регистром SS.
Примеры команд безусловной передачи управления приведены в таблицах 2.12 и 2.13.
Таблица 2.12. Примеры внутрисегментых команд передачи управления.
Внутрисегментные |
|
Прямые |
Косвенные |
JMP LABEL |
JMP MEMLOC |
CALL LABEL |
JMP BX |
RET |
CALL WORD PTR MEMLOC |
RET 6 |
CALL CX |
CALL WORD PRT ES: MEMLOC |
|
Таблица 2.13. Примеры межсегментных команд передачи управления. |
|
Прямые |
Косвенные |
JMP LABEL |
JMP DWORD PTR MEMLOC |
CALL LABEL |
JMP DWORD PTR [BP] |
RET |
JMP DWORD PTR CS:[BX] |
RET 6 |
CALL MEMLOC |
CALL DWORD PTR SS: MEMLOC |
Тип перехода или вызова при косвенных передачах через ячейку памяти определяется по типу объявленной переменной (WORD или DWORD) или явно в команде посредством операции WORD PTR или DWORD PTR. Возврат не может быть косвенным, так как управление всегда возвращается в место вызова, однако существует разновидность возврата, которая после восстановления значений содержимого регистра IP, прибавляет к значению указателя стека константу, содержащуюся в команде как непосредственный операнд. В результате из стека извлекаются и уничтожаются дополнительные элементы (то есть, например, параметры, переданные процедуре). Удобнее, чем чистить стек командой INC SP после возврата из процедуры, так как при многократных вызовах процедуры это надо будет делать каждый раз.
2.5.4.2. Команды условных переходов.
Команды условных переходов вместе с командой CMP реализуют передачу управления в зависимости от отношения между двумя числами. Сначала процессор выполняет команду сравнения и устанавливает по результату флаги, а затем выполняет команду условного перехода, которая проверяет флаги и производит переход, если числа удовлетворяют заданному отношению. Числа могут проверяться на равенство или требуется узнать, какое из них больше или меньше. Какое число больше 11111111 или 00000000? Если число без знака, то первое = 255, а второе = 0 и первое больше второго. Если число со знаком, то первое = (-1) и меньше второго. Следовательно, отношения “меньше” или “больше” зависят от того, знаковые или беззнаковые числа. Поэтому целесообразно ввести новые термины, позволяющие различать эти два случая. При сравнении знаковых чисел пользуемся терминами “больше” и “меньше”, а при сравнении беззнаковых чисел терминами “выше” и “ниже” (так как беззнаковые числа обычно используются для сравнения адресов). Каждое из условий можно определить по состояниям флагов, поэтому в микропроцессоре есть команды, ориентированные на проверку отношений и команды, ориентированные на проверку состояния флагов. Перечень команд условных переходов приведен в таблице 2.14.
Таблица 2.14. Перечень команд условных переходов.
Команда |
Описание |
Состояние флагов |
JE / JZ |
Перейти, если равно / если ноль |
ZF = 1 |
JNE / JNZ |
Перейти, если не равно / если не ноль |
ZF = 0 |
JL / JNGE |
Перейти, если меньше / если не больше и не равно |
SF OF |
JNL / JGE |
Перейти, если не меньше / если больше или равно |
SF = OF |
JG / JNLE |
Перейти, если больше / если не меньше и не равно |
ZF = 0 & SF = OF |
JNG / JLE |
Перейти, если не больше / если меньше или равно |
ZF = 1 & SF OF |
JB / JNAE |
Перейти, если ниже / если не выше и не равно |
CF = 1 |
JNB / JAE |
Перейти, если не ниже / если выше или равно |
CF = 0 |
JA / JNBE |
Перейти, если выше / если не ниже и не равно |
CF = 0 & ZF = 0 |
JNA / JBE |
Перейти, если не выше / если выше или равно |
CF = 1 & ZF = 1 |
JC / JNC |
Перейти, если есть перенос / если переноса нет |
CF = 1 / CF = 0 |
JS / JNS |
Перейти, если есть знак / если нет знака |
SF = 1 / SF = 0 |
JO / JNO |
Перейти, если переполнение / если не переполнение |
OF = 1 / OF = 0 |
JP / JNE |
Перейти, если есть паритет / если паритет четный |
PF = 1 |
JNP / JPO |
Перейти, если паритета нет / если паритет нечетный |
PF = 0 |
JCXZ |
Перейти, если CX = 0 |
CX = 0 |
JECXZ |
Перейти, если ECX = 0 |
CX = 0 |
Команды условного перехода могут использоваться не только с командой CMP, но и с любой другой командой, воздействующей на флаги. Каждая из команд условного перехода в 80286 состоит из 8-битного кода операции и 8-бит, определяющих место перехода (то есть имеет размер 2 байта). 8 бит определяют относительное смещение места перехода и команды условного перехода, то есть в диапазоне -128 +127 байт от команды. “Близкий” или “далёкий” условный переход всегда можно сделать при помощи двух команд: “короткого” условного перехода и “близкого” или “далёкого” безусловного перехода. В микропроцессоре 80386 команды условного перехода могут быть с типом NEAR.
2.5.4.3.Команды SetCondition
SETCC |
СС - код условия совпадает с кодами условий в командах JCC условного перехода |
Формат команд:
SETCC reg/ mem 8- если условияСС удовлетворяется, то в байт- операнд помещается код 01H, иначе - код 00Н.
Команды управления циклами.
Команды управления циклами обеспечивают передачи управления при организации циклов. У микропроцессора регистр СX служит счётчиком числа повторений циклов. Каждая команда управления циклами уменьшает содержимое регистра CX на 1, а затем использует его новое значение для “принятия решения” о выполнении или не выполнении перехода. Основная команда этой группы LOOP уменьшает содержимое регистра CX на 1 и передаёт управление операнду 'близкая' метка, если содержимое регистра CX не равно 0.
Например:
MOV CX, 100 ; Загрузить счётчик циклов (CX 0 в начале цикла!!)
...;
START: ...;
...;
LOOP START ; Если CX 0, то перейти к метке START, иначе выйти из цикла
...;
Выход из цикла до достижения CX=0 обеспечивают команды LOOPE/LOOPZ (повторять, если равно) и LOOPNE/LOOPNZ (повторять, пока не равно). Команда LOOPE / LOOPZ уменьшает содержимое CX на 1, затем осуществляет переход, если CX 0 и флаг нуля ZF=1. Обычно LOOPE используют для поиска первого ненулевого результата в серии операций. Команда LOOPNE / LOOPNZ уменьшает CX на 1, затем осуществляет переход, если CX 0 и флаг нуля ZF=0. Обычно LOOPNE используется для поиска первого нулевого результата в серии операций. Для того чтобы определить, по какому условию произошел выход из цикла можно использовать команду JCXZ (CX=0).
2.5.5.Цепочечные (строковые) команды.
Под цепочкой (строкой) понимается последовательность байт, слов или двойных слов в памяти, а цепочечной операцией называется операция, которая выполняется над каждым элементом цепочки. Микропроцессор имеет набор команд, которые сокращают время выполнения операций по обработке цепочек. Сокращение времени достигается за счёт мощного набора примитивных команд, ускоряющих обработку каждого элемента цепочки и за счёт устранения служебных действий, которые обычно требуются между обработкой последовательных элементов. Перечень цепочечных команд приведен в таблице 2.15.
Таблица 2.15. Перечень цепочечных команд.
Мнемоника |
Описание |
Модифицирует |
MOVS (передать цепочку ) |
источник приемник |
SI, DI (ESI,EDI) |
CMPS (сравнить цепочки ) |
источник- приемник |
SI, DI (ESI,EDI) |
SCAS (скопировать цепочку ) |
AL (AX,EAX)- приемник |
DI (EDI) |
*INS (ввести цепочку ) |
входной порт приемник |
DI (EDI) |
*OUTS (вывести цепочку ) |
источник выходной порт |
SI (ESI) |
LODS (загрузить цепочку ) |
источник AL (AX,EAX) |
SI (ESI) |
STOS (запомнить цепочку) |
AL (AX,EAX) приемник |
DI (EDI) |
* В операциях над словами вместо AL используется AX, для двойных слов- EAX. По умолчанию микропроцессор предполагает, что цепочка-приёмник находится в дополнительном сегменте и адресуется парой регистров ES : DI (или для двойных слов - ES:EDI), а цепочка-источник в текущем сегменте данных и адресуется парой регистров DS : SI (для двойных слов - ES:ESI ). Цепочечные команды автоматически модифицируют указатели для адресации следующего элемента цепочки. Флаг направления DF определяет направление обработки цепочки. Если DF = 0, то значения регистров DI и SI увеличиваются, а если DF = 1, то значения регистров DI и SI уменьшаются. В первом случае мы двигаемся по цепочке в прямом направлении (слева - направо), во втором случае - в обратном (справа - налево).
Состоянием флага DF можно управлять с помощью двух команд: CLD (DF 0) и STD (DF 1). Одна команда обработки цепочки обрабатывает один элемент цепочки длиной 8, 16 или 32 бит.
Для того чтобы одна команда обработала группу последовательных элементов перед ней надо указать префикс повторения. При этом число повторений извлекается из регистра CX. Префикс REP даёт указание повторять команду, пока не обнаружится конец цепочки, то есть CX = 0. Префиксы REPE и REPZ (повторять пока равно) повторяют цепочечную команду, пока флаг ZF = 1 и CX 0.
Например:
MOV CX, 100; поэлементное сравнение
REPE CMPS DEST, SOURCE; DEST и SOURCE до первого несовпадения
REPNE / REPNZ; (повторять, пока не равно) обеспечивают повторение команды, пока ZF = 0 и CX 0. Если в предыдущем примере REPNE CMPS DEST, SOURCE будет повторяться до первого совпадения.
Префиксы REPE / REPZ и REPNE / REPNZ используются с командами сравнения или сканирования цепочки, так как они воздействуют на флаг ZF.
2.5.5.1.Команды пересылки цепочки.
Формат общей команды: MOVS цепочка-приёмник, цепочка-источник
Дополнительные команды:
MOVSB
MOVSW
MOVSD
В команде MOVS операнды нужны только для того, чтобы ассемблер узнал, что нужно пересылать байты или слова, так как смещение цепочки-приёмника предварительно должно быть загружено в регистр DI, а смещение цепочки-источника в регистр SI. Ассемблер преобразует команду MOVS в одну из команд MOVSB, MOVSW или MOVSD, следовательно, можно сразу их употреблять в программе.
Примеры:
MEMW1 DW 10 DUP (1), 5 DUP (0)
MEMW2 DW 15 DUP (?)
MOV AX, @DATA
MOV DS, AX
MOV ES, AX
CLD
MOV SI, OFFSET MEMW1
MOV DI, OFFSET MEMW2
MOV CX, 15
REP MOVS MEMW2, MEMW1; REP MOVSW
2.5.5.2.Команды сравнения цепочек.
Формат общей команды: CMPS цепочка-приёмник, цепочка-источник
Дополнительные команды:
CMPSB
CMPSW
CMPSD
Подобна CMP, однако CMPS производит обратное по отношению с CMP вычитание, вычитает из источника приёмник, а CMP, наоборот - из приёмника источник. CMPSB и CMPSW - соответствующие версии команды сравнения строк байтов или строк слов. Если мы используем префиксы повторения REPE / REPZ или REPNE / REPNZ, то операция сравнения может завершиться в двух случаях: CX=0 или ZF=0 для REPE (ZF=1 для REPNE). Для того чтобы узнать, какая ситуация имела место, следует указать после CMPS команду условной передачи управления, проверяющую флаг ZF, а именно JE (JZ) или JNE (JNZ).
Пример:
CLD
MOV CX, 100
REPNE CMPS DEST, SOURCE
JNE NOT_FOUND; Переход к метке NOT_FOUND, если нет ни одной совпадающей пары.
...
NOT_FOUND:
...
2.5.5.3.Команды сканирования цепочек.
Команды сканирования цепочек позволяют осуществить поиск заданного значения в цепочке, находящейся в дополнительном сегменте. Смещение адреса первого элемента цепочки должно быть помещено в регистр DI. При сканировании цепочки байтов искомое значение должно находиться в регистре AL, при сканировании цепочки слов - в регистре AX, а при сканировании цепочки двойных слов - в регистре ЕAX.
Формат основной команды: SCAS цепочка-приёмник.
Дополнительные команды:
SCASB,
SCASW,
SCASD.
Если при сканировании обнаружен заданный элемент, то в DI смещение адреса следующего за ним элемента, а ZF = 0. С командами данной группы можно использовать префиксы REPE / REPNE.
2.5.5.4.Команды загрузки.
Команда LODS пересылает операнд цепочка-источник, адресованный регистром SI из сегмента данных в регистр AL (AX или EAX) а затем изменяет регистр SI так, чтобы он указывал на следующий элемент цепочки.
Формат основной команды: LODS цепочка-источник.
Дополнительные команды:
LODSB,
LODSW,
LODSD.
Команды сохранения цепочек.
Команда STOS пересылает цепочку байт, слов или двойных слов из регистра AL (AX или EAX) в элемент операнда цепочка-приёмник, адресуемый парой регистров ES : DI.
Формат основной команды: STOS цепочка-приемник.
Дополнительные команды:
STOSB,
STOSW,
STOSD.
С командами данной группы можно использовать префикс REP.
2.5.5.5.Команды ввода и вывода цепочек.
Обеспечивают считывание данных из входного устройства в последовательные ячейки памяти и запись данных из последовательных ячеек в выходное устройство. Они упрощают передачи больших блоков данных между памятью и внешними устройствами. INS передаёт данные из входного порта, определяемого содержимым регистра DX в байт или слово, смещение которого находится в ES:DI (ES:EDI) и производит уменьшение или увеличение DI на 1 (или 2), или EDI на 4. Аналогично OUTS передаёт байт, слово или двойное слово, смещение которого находится в DS:SI (DS:ESI), в выходной порт, адресуемый регистром DX и производит увеличение или уменьшение содержимого регистра SI на 1 (или 2) или ESI на 4. Команд INS и OUTS в 8086 нет. Дополнительные команды:
INSB,
INSW,
INSD,
OUTSB,
OUTSW,
OUTSD.
С командами данной группы можно использовать префикс REP.
2.5.5.6.Замена сегмента.
Можно ли изменить адресацию регистра SI (ESI) с сегмента данных на дополнительный сегмент? Можно, если использовать префикс замены сегмента, например:
LEA SI, ES : H1; копирует байт из строки H1 в строку H2. Обе строки в дополнительном сегменте
LEA DI, H2
MOVSB
Нельзя заменить сегмент, к которому адресуется регистр DI (EDI). Для того чтобы работать со строками в сегменте данных, надо в регистр ES загрузить значение, равное содержимому регистра DS.
Например:
MOV AX, @DATA
MOV ES, AX
MOV DS, AX
или:
PUSH DS
POP ES
2.5.6.Команды управления микропроцессором.
2.5.6.1.Команды управления флагами.
Микропроцессор имеет команды для установки и сброса флага переноса (STC, CLC), флага направления (STD, CLD) и флага прерывания (STI, CLI). Есть также команда инвертирования флага переноса (CMC). Перечень команд управления процессором приведена в таблице 2.16.
Таблица 2.16. Перечень команд управления процессором.
Мнемоника |
Описание |
CLC сбросить флаг переноса |
0 CF |
CMC инвертировать флаг переноса |
1 - CF CF |
STC установить флаг переноса |
1 CF |
CLD сбросить флаг направления |
0 DF |
STD установить флаг направления |
1 DF |
CLI сбросить флаг разрешения прерывания |
0 IF |
STI установить флаг разрешения прерывания |
1 IF |
CLI микропроцессор игнорируют маскируемые прерывания, но обрабатывает немаскируемые прерывания.
2.5.6.2.Команды синхронизации.
Одним из средств синхронизации процессора с внешними устройствами являются прерывания, но в его архитектуре реализованы ещё две формы синхронизации: первая относится к использованию сопроцессора, вторая - к разделению ресурсов с другими процессорами в мультипроцессорной системе. Например, для реализации вещественной арифметики целесообразно использовать специальный арифметический сопроцессор. Он работает только во взаимодействии с основным процессором .
В частности, когда основной процессор встречает специальную команду ESC, он передает ее на исполнение сопроцессору. Команда ESC показывает, какую операцию должен выполнить сопроцессор (код операции), эту информацию основной процессор игнорирует, но команда ESC задаёт для сопроцессора операнд в памяти (или регистре). Эту информацию основной процессор использует так: он вычисляет адрес операнда, а затем считывает его или записывает в память по запросу процессора. ESC применяется вместе с командой ожидания WAIT, обеспечивающей синхронизацию процессоров; с её помощью основной процессор проверяет, когда сопроцессор заканчивает свою операцию.
Если в многопроцессорной системе возникает проблема разделения общей памяти, то для избежания использования не полностью откорректированной информации вторым процессором при проведении операций коррекции первым в системе команд микропроцессора существует префикс блокировки шины LOCK. Например, чтобы нельзя было прервать команду пересылки элементов строки можно написать: LOCK REP MOVS. Такая команда выдает сигнал LOCK на всё время выполнения команды MOVS, что запрещает другим процессорам доступ к памяти.
2.5.6.3.Команда холостого хода.
Команда NOP (нет операции) - не выполняет никакой операции, она только увеличивает значение указателя команд IP. Эта команда находит много применений: удобна при тестировании в качестве точки останова трассировки, используется для организации задержки и так далее.
2.5.6.4.Команды прерываний.
Средства прерывания работы процессора внешними устройствами освобождают его от периодической проверки необходимости обслуживания устройств (циклического опроса). Микропроцессор имеет два входа, по которым внешние устройства могут привлечь его внимание: вход NMI немаскируемого прерывания и вход INTR маскируемого прерывания.
Когда внешнее устройство формирует сигнал на входе NMI, процессор прекращает свои действия (но не в середине команды) и реагирует на прерывание. По входу NMI должны появляться только прерывания из-за катастрофических событий (например, отказ сети, ошибка памяти).
Если катастрофических событий нет, внешнее устройство может прервать процессор по входу INTR. Процессор может игнорировать этот сигнал. Это зависит от состояния флага IF: если IF = 0 (процессор не реагирует на прерывания), если IF = 1 - реагирует.
Кроме сигнала на входе INTR внешнее устройство должно сообщить процессору причину прерывания. По запросу процессора внешнее устройство сообщает число из диапазона 0..255, соответствующее причине прерывание, которое называется номером прерывания. Для каждого номера прерывания существует своя программа, которую процессор должен выполнить до возобновления прерванной задачи. Адреса этих программ находятся в 256-элементной таблице векторов прерываний. Каждый её элемент состоит из 4-х байт и содержит полный адрес процедуры обработки соответствующего прерывания (вектор прерывания).
При поступлении сигнала INTR (IF = 1) процессор завершает текущую команду и готовится выполнить процедуру прерывания. Прежде всего он сохраняет в стеке текущее состояние регистра флагов и регистров CS и IP. Затем процессор получает от внешнего устройства номер прерывания и помещает в IP и CS вектор прерывания по соответствующему номеру. Когда приходит прерывание по входу NMI (независимо от флага IF), процессор производит аналогичные действия, за исключением получения номера прерывания, так как причина прерывания по входу NMI всегда одна. Для процедуры прерывания NMI отведён элемент с номером 2 в таблице прерываний.
Выше речь шла о прерываниях, формируемых внешними устройствами, так называемых внешних прерываниях. Но процессор сам генерирует внутренние прерывания, если при выполнении некоторых команд происходит что-то неожиданное. Это так называемые особые случаи, которые свидетельствуют о серьёзной ошибке. Первый 32 элемента в таблице прерываний зарезервированы для внутренних прерываний и прерывания NMI. Процессор 8086 и все последующие в реальном режиме работы генерирует только первые 5 номеров прерываний. Процедура прерывания заканчивается выполнением команды IRET (возврат из прерывания), которая восстанавливает из стека содержимое IP, CS и флагов.
Некоторые процедуры прерываний удобно вызывать и тогда, когда прерываний нет (например функции DOS или BIOS). Поэтому было бы хорошо иметь команду, которая делала бы то, что делает процессор при распознавании прерываний, за исключением одного - номер прерывания содержится в команде, а не выдаётся внешним устройством. Такой командой и является команда INT n, где n - целое число от 0 до 255. Перечень команд прерываний приведен в таблице 2.17.
Таблица 2.17. Перечень команд прерываний.
Мнемоника |
Описание |
INT n |
Прерывание типа n (длина 2 байта) |
INT |
Прерывание типа 3 (один байт) применяется в отладчиках для реализации останова) |
INTO (IF = 1, OF = 1) |
Прерывание по переполнению (если OF=1) генерирует прерывание №4 |
IRET |
Возврат из прерывания |
HLT |
Останов. Прекращает все действия процессора, пока не будет произведен аппаратный сброс или не придет внешнее прерывание (NMI всегда выводит из состояния прерывания, остальные- только если IF=1) |
При установке точки останова в отладчике, требуется поместить в точку останова какую-либо команду, которая передала бы управление отладчику. Для этой цели подошла команда INT, которая сохраняет регистры CS и IP. Так как тип прерывания для этой цели не надо передавать, то используют однобайтную форму команды. Отладчик использует команду INT для генерирования прерывания типа 3 при отладке программ, следовательно в наших программах не следует использовать это прерывание.
Прерывания компьютеров семейства PC могут быть разделены как правило на 3 группы: внутренние прерывания микропроцессора, внешние (аппаратные) прерывания, программые прерывания.
2.5.7.Новые команды микропроцессора 80486
В системе команд микропроцессора 80486 появились новые команды BSWAP, XADD, CMPXCHG.
1. BSWAP reg 32- обмен байт в операнде.
(07) разряды (2431) разрядами,
(815) разряды (1623) разрядами.
Используется для преобразования форматов данных с различной адресацией: с младшей стороны и со старшей стороны.
2. XADD mem 8/ 16/ 32(приемник), reg 8/ 16/ 32(источник)
источник= приемнику,
приемник= приемник + источник
3. CMPXCHG mem 8/ 16/ 32 (приемник), reg AL/ AX/ EAX ( ист.)
Если приемник= АХ, то приемник= источнику, иначе АХ=приемнику и ZF=0. Используется для проверки и модификации семафоров.
Каждая программа на языке ассемблера помимо команд процессора содержит еще и специальные инструкции, указывающие самому ассемблеру, как организовать специальные секции программы, где располагаются данные, а где команды, позволяющие выбирать тип системы команд, налаживать связи между процедурами и так далее. Разные ассемблеры используют разные наборы директив, но TASM и MASM (два самых популярных ассемблера для DOS и Windows) поддерживают общий набор директив. Все дальнейшие примеры директив приведены для этих ассемблеров (точнее, TASM поддерживает набор директив MASM наряду с собственным набором директив Ideal Mode).
Программа на языке ассемблера состоит из строк, имеющих следующий вид:
Метка команда/директива операнды; комментарий.
Все поля необязательны. Метка может быть любой комбинацией букв английского алфавита, цифр и символов: _, $, @, ?, но цифра не может быть первым символом метки, а символы $ и ? иногда имеют специальное значение и не рекомендуются к использованию.
Большие и маленькие буква по умолчанию не распознаются, но различие можно включить при помощи опций при вызове ассемблера. Во втором поле, поле команды, может располагаться команда процессора, которая транслируется в исполняемый код, или директива ассемблера, которая не приводит к генерации кода, а управляет работой самого ассемблера. В поле операндов располагаются требуемые командой или директивой операнды. В поле комментария, начало которого отмечается символом ; (точка с запятой), можно написать все что угодно.
Если метка располагается перед командой процессора, сразу после нее всегда ставится оператор : (двоеточие), который указывает ассемблеру, что надо создать переменную с этим именем, содержащую адрес текущей команды:
mov cx, 10; занести в cx число элементов массива mas
xor si, si; обнулить индексный регистр si
xor ax, ax; обнулить регистр ax, в котором будет сумма элементов массива слов mas
m1: add ax, mas[si]; сложить содержимое ax и очередной элемент массива
inc si; увеличить индекс элемента массива на 2,
inc si; так как элемент массива - слово
loop m1; вернуться на начало цикла, если cx>0.
Если метка стоит перед директивой ассемблера, то двоеточие не ставится, так как метка в этом случае является операндом директивы. Рассмотрим директивы, работающие напрямую с метками и их значениями, - LABEL, EQU и =.
метка LABEL тип.
Директива LABEL определяет метку и задает ее тип: BYTE (байт), WORD (слово), DWORD (двойное слово), FWORD (6 байт), QWORD (учетверенное слово), TBYTE (10 байт), NEAR (ближняя метка), FAR (дальняя метка). Метка получает значение, равное следующим за ней данным (для всех типов, кроме двух последних) или равное адресу следующей команды (для типов NEAR и FAR). С помощью директивы LABEL удобно организовывать доступ к одним и тем же данным, как к байтам, так и словам, определив перед ними две метки с разными типами. Метки типа NEAR или FAR можно использовать для вызова процедуры:
call метка.
Директива EQU присваивает метке значение, которое определяется как результат целочисленного выражения в правой части. Результатом этого выражения может быть целое число, адрес или любая строка символов:
one equ 1
mes1 equ Ошибка $
var2 equ 4[si]
cmp ax, one ; cmp ax, 1
db mes1 ; db Ошибка $
mov ax, var2 ; mov ax, 4[si].
Директива EQU используется для введения параметров, общих для всей программы.
Директива = эквивалентна EQU, но определяемая ею метка может принимать только целочисленные значения, кроме того, указанная этой директивой метка может быть переопределена. Существует предопределенная метка $, которая соответствует текущему адресу. Данную метку удобно использовать для определения длины строки текста или числа элементов в массиве:
.data
path1 db D:\students\641\*.*
length equ $ - path1; метка length будет иметь значение, равное числу символов в переменной path1.
Псевдокоманды определения данных
Псевдокоманда это директива ассемблера, которая приводит к включению данных или кода в программу, хотя никакой команде процессора не соответствует. Псевдокоманды определения переменных указывают ассемблеру, что соответствующем месте программы располагается переменная, устанавливают ее тип (байт, слово, вещественное число и так далее) , задают начальное значение и ставят в соответствие переменной метку, которая будет использоваться для обращения к этим данным. Псевдокоманды определения данных записываются в общем виде следующим образом:
имя_переменной d* значение,
где d* - одна из псевдокоманд:
DB определить байт;
DW определить слово (2 байта);
DD определить двойное слово (4 байта);
DF определить 6 байт (адрес в формате 16-битный селектор; 32-битное смещение);
DQ определить учетверенное слово (8 байта);
DT определить 10 байт (80 битные типы данных, используемые FPU).
Пример использования псевдокоманд определения переменных:
txt_str db Hello, world!
number dw ?
table db 10 dup(0)
float_n dd 3.1415.
Первая строка содержит 13 байт ASCII- кодов строки символов Hello, world! и переменная txt_str указывает на первую букву в этой строке. Во второй строке знак ? указывает на то, что переменная является неинициализированной и ее значение на момент запуска может оказаться любым. Для заполнения участка памяти повторяющимися данными используется оператор DUP, имеющий формат счетчик dup(значение). В третьей строке примера создается массив из 10 слов, инициализированных нулевым значением. Переменная table указывает на первый элемент массива. В качестве аргумента в операторе DUP могут выступать несколько значений, разделенных запятыми, и даже дополнительные вложенные операторы DUP.
Модели памяти задаются директивой .MODEL.
model модель, язык, модификатор, где модель одно из следующих слов:
TINY код, данные и стек размещаются в одном и том же сегменте размером до 64 Кб. Эта модель памяти используется для написания программ на языке ассемблера в формате COM файла;
SMALL код размещается в одном сегменте, а данные и стек в другом (для их описания могут применяться разные сегменты, но объединенные в одну группу). Эта модель памяти используется для написания программ на языке ассемблера в формате EXE файла;
COMPACT код размещается в одном сегменте, а для хранения данных могут использоваться несколько сегментов;
MEDIUM код размещается в нескольких сегментах, а все данные в одном;
LARGE, HUGE и код, и данные могут занимать несколько сегментов;
FLAT то же, что и TINY, но используются 32 битные сегменты, так что максимальный размер сегмента, содержащего и данные, и код, и стек, - 4 Мб.
Язык необязательный операнд, принимающий значения различных языков программирования, при указании которого подразумевается, что процедуры рассчитаны на вызов из программ на соответствующем языке программирования.
Модификатор это необязательный операнд, принимающий значения NEARSTACK (по умолчанию) или FARSTACK. Во втором случае сегмент стека не будет объединяться в одну группу с сегментами данных.
Упрощенные директивы определения сегментов
Каждая программа, написанная на любом языке программирования, состоит из одного или нескольких сегментов. Область памяти, в которой находятся команды, называется сегментом кода, область памяти с данными сегментом данных и область памяти, отведенная под стек сегментом стека. Ассемблер позволяет помещать данные в сегмент кода, разносить код по нескольким сегментам, помещать стек в один сегмент с данными или вообще использовать один сегмент для всего. Для описания сегментов программы используются директивы SEGMENT и ENDS. Однако, чаще всего используются упрощенные директивы определения сегментов, которые вступают в силу после установления модели памяти.
Директива .CODE описывает сегмент кода:
.code.
Директива .STACK описывает сегмент стека:
.stack размер.
Директива .DATA описывает основной сегмент данных:
.data.
Процедурой в ассемблере является всё то, что в других языках называют подпрограммами, функциями, процедурами и т.д. Ассемблер не накладывает на процедуры никаких ограничений- на любой адрес программы можно передать управление командой CALL, и оно вернётся к вызвавшей процедуре, как только встретится команда RET. Такая свобода выражения легко может приводить к трудночитаемым программам, и в язык ассемблера были включены директивы логического оформления процедур.
Метка proc язык тип USES регистры
…
ret
метка endp
Все операнды PROC необязательны.
Тип может принимать значения NEAR и FAR, и если он указан, все команды RET в теле процедуры будут заменены соответственно на RETN и RETF. По умолчанию подразумевается, что процедура имеет тип NEAR в моделях памяти TINY, SMALL и COMPACT.
Конец программы
End start_label
Этой директивой завершается любая программа на ассемблере. В роли необязательного операнда здесь выступает метка (или выражение), определяющая адрес, с которого начинается выполнение программы. Если программа состоит из нескольких модулей, только один файл может содержать начальный адрес, так же как в С только один файл может содержать функцию main().
По умолчанию ассемблеры используют набор команд процессора 8086 и выдают сообщения об ошибках, если выбирается команда, которую этот процессор не поддерживал. Для того чтобы ассемблер разрешил использование команд, появившихся в более новых процессорах, и команд расширений, предлагаются следующие директивы:
.8086- используется по умолчанию. Разрешены только команды 8086;
.186- разрешены команды 80186;
.286 и .286с- разрешены непривилегированные команды 80286;
.286р- разрешены все команды 80286;
.386 и .386с- разрешены непривилегированные команды 80386;
.386р- разрешены все команды 80386;
.486 и 486с- разрешены непривилегированные команды 80486;
.486р- разрешены все команды 80486;
586 и 586с- разрешены непривилегированные команды P5 (Pentium);
.586р- разрешены все команды P5 (Pentium);
.686 - разрешены непривилегированные команды P6 (Pentium Pro, Pentium II);
.686р- разрешены все команды P6 (Pentium Pro, Pentium II);
.8087 разрешены команды арифметического сопроцессора 8087;
.287 разрешены команды арифметического сопроцессора 80287;
.387 разрешены команды арифметического сопроцессора 80387;
.487 разрешены команды FPU 80486;
.587 разрешены команды FPU 80586;
.MMX разрешены команды IA MM;
.K3D разрешены команды AMD 3D;
Если присутствует директива .386 и выше, ассемблер TASM определяет все сегменты как 32-битные при условии, что директива указана перед директивой .model.
; Файл с текстом программы hello-1.asm
; Выводит на экран сообщение Hello World! и завершается.
; Генерируется исполняемый модуль типа .EXE при помощи вызова ассемблера TASM и редактора TLINK:
; tasm hello-1.asm
; tlink hello-1.obj
.model small ; Модель памяти, используемая для EXE
.stack 100h ; Сегмент стека размером в 256 байт.
.data
message db 'Hello World!',0Dh,0Ah,'$'
.code
start: mov ax, @data ; Настройка сегментного регистра
mov ds,ax ; ds на начало сегмента данных.
mov dx,offset message
mov ah,9
int 21h ; Вызов функции DOS для вывода строки.
mov ax,4C00h
int 21h ; Вызов функции DOS для завершения программы.
end start
; Файл с текстом программы hello-2.asm
; Выводит на экран сообщение Hello World! и завершается.
; Генерируется исполняемый модуль типа .COM при помощи вызова ассемблера TASM и редактора TLINK:
; tasm hello-2.asm
; tlink /t hello-2.obj
.model tiny ; Модель памяти, используемая для .COM
.code ; Начало сегмента кодов
org 100h ; Начальное значение программного счетчика
; внутренней переменной ассемблера, равная
;смещению относительно начала сегмеента - 100h
jmp start ; Переход на начало программы
message db 'Hello World!',0Dh,0Ah,'$' ; Строка для вывода
start: mov ah,9 ; Номер функции DOS - в AH
mov dx,offset message ; Смещение адреса строки - в DX
int 21h ; Вызов системной функции DOS
ret ; Завершение COM- программы
end start ; Конец текста программы.
Арифметический сопроцессор предназначен для вычислений над числами с плавающей точкой и может работать только в паре с основным процессором. Применение сопроцессора в задачах, использующих сложные вычисления (машинная графика, статические и инженерные расчеты) позволяет повысить быстродействие системы.
Первый из семейства это восьмиразрядный сопроцессор 8087, затем появились шестнадцатиразрядные модели 80287 и 80387. Сопроцессор 80387 - имеет расширенный набор команд по сравнению с моделью 80287 и большее быстродействие. В микропроцессорах 80486 DX, а затем и во всех последующих моделях существует встроенное устройство для выполнения операций с числами с плавающей точкой (FPU), являющееся одним из модулей основного процессора. Это позволило еще больше увеличить производительность персонального компьютера.
Сопроцессор поддерживает представление чисел в следующих форматах: целые двоичные, целые двоично-десятичные и вещественные двоичные числа.
Целые двоичные числа могут быть представлены в трех различных форматах:
1. Целое слово - 16 бит (DW);
2. Короткое целое слово - 32 бита (DD);
3. Длинное целое слово - 64 бита (DQ);
Все они представимы в обычном формате целых чисел со знаком.
Двоично-десятичные целые числа представлены в упакованном двоично-десятичном формате размером 80 бит (DT), при этом каждая десятичная цифра кодируется четырьмя двоичными разрядами.
1 бит |
7 бит |
72 бита |
|||
S |
d17 |
........ |
d1 |
d0 |
|
Знак |
Не исп. |
4 бита=1 цифра |
Вещественные числа могут быть представлены тремя различными форматами:
1. Короткое вещественное (одинарная точность) -32 бита (DD);
1 бит |
8 бит |
23 бита |
|
S |
порядок |
мантисса |
DD |
2. Длинное вещественное (двойная точность) - 64 бита (DQ);
1 бит |
11 бит |
52 бита |
|
S |
порядок |
Мантисса |
DQ |
3. Временное вещественное (расширенная точность) - 80 бит (DT);
1 бит |
15 бит |
64 бита |
|
S |
Порядок |
мантисса |
DT |
1) S- поле знака: равно нулю, если число положительное и равно 1, если число отрицательное;
Для представления нуля используются нулевой порядок и нулевая мантисса, следовательно существует два нуля: положительный и отрицательный. Обычно этот факт скрыт от программиста - в командах сравнения оба пуля считаются одним числом.
2) Поле мантиссы.
В сопроцессоре принята “научная нотация“ представления чисел. При этом предполагается, что поле мантиссы представимо в виде Х.ХХ...Х, где старший бит, находящийся слева от точки должен быть не равен нулю. Для двоичной системы счисления это означает, что старший бит должен быть равен единице. Следовательно, его можно не хранить, что и сделано в форматах одинарной и двойной точности для расширения диапазона представления чисел. В формате с расширенной точностью старший бит хранится явно, так как дополнительная точность не требуется, а вычисления происходят быстрее.
3) Поле порядка. Порядок - это степень числа два, на которое надо умножить мантиссу.
Для представления отрицательных порядков в поле порядка хранится сумма истинного порядка и смещение. Для одинарной точности смещение равно 127. Для двойной точности смещение равно 1023. Для расширенной точности смещение равно 16383.
Если поле порядка составляет 8 бит как в формате с одинарной точностью, то максимальное значение порядка составляет 28-1 = 255 , то есть диапазон хранимых порядков рассчитывается следующим образом:
255 - 127 = 128 максимальный порядок;
0 - 127 = -127 минимальный порядок.
Аналогично можно рассчитать диапазоны хранимых порядков для форматов чисел с двойной и расширенной точностью.
Так как во всех форматах чисел минимальное и максимальное значения порядков зарезервированы для обработки особых случаев, то реальный диапазон порядка нормализованных чисел меньше на два для всех форматов чисел, то есть для чисел с одинарной точностью максимальный порядок равен 127 ,а минимальный порядок равен 126.
Формат чисел с двойной точностью позволяет получить произведение двух чисел с одинарной точностью без потери точности.
Формат чисел с расширенной точностью предназначен для представления промежуточных результатов при работе с числами в формате с двойной точностью. Существует три причины выбора 80 разрядного представления чисел в формате с расширенной точностью:
Исследования показали, что для самых сложных для вычислений математических функций не происходит потери точности при получении окончательных результатов в формате чисел с двойной точностью, если размер мантиссы составляет не менее 64 бит, при этом порядок составляет 15 бит и общий минимальный размер двоичного числа составляет 80 бит;
Для того чтобы использовать более привычное 16-байтное представление чисел с расширенной точностью (128 бит) требуются более сложные схемы процессора или при тех же схемах будет меньшая производительность процессора;
Цель формата расширенной точности - защита промежуточных результатов. Если взять удобный 16-байтный формат, то может случиться, что все вычисления будут производиться в нем и тогда надо расширять точность для промежуточных результатов и так далее.
Внутреннее представление нормализованных чисел:
Min число < 0 |
Max число < 0 |
|||||||
знак |
порядок |
мантисса |
знак |
Порядок |
Мантисса |
|||
1 |
1...10 |
11...1 |
1 |
0…01 |
00…0 |
|||
+1 |
+1 |
|||||||
Min число > 0 |
Max число < 0 |
|||||||
Знак |
порядок |
мантисса |
знак |
порядок |
Мантисса |
|||
0 |
0...01 |
00...0 |
0 |
1…10 |
11…1 |
|||
+1 |
+1 |
Единица подразумевается в старшем разряде мантиссы для чисел в формате с одинарной и двойной точностью. Дивпазоны представлеения десятичных чисел в двоичных вещественных форматах:
а) с одинарной точностью:
-3.37*1038 / -1.17*10-37
+1.17*10-37 / +3.37*1038
б) с двойной точностью:
-1.67*10308 / -2.23*10-307
+2.23*10-307 / +1.67*10308
в) с расширенной точностью:
-1.2*104932 / -3.37*10-4931
+3.37*10-4931 / +1.2*104932
При реализации операций с вещественными числами возникают внутренние прерывания сопроцессора, называемыми особыми случаями сопроцессора (ОС). Если результат арифметической операции меньше минимального отрицательного числа или больше максимального положительного числа в данном формате, то такое состояние называется переполнением.
Если результат арифметической операции меньше минимального положительного числа и больше максимального отрицательного числа в данном формате, то такое состояние называется антипереполнением.
Сопроцессор генерирует шесть особых случаев вещественной арифметики:
1. Неточный результат. Возникает, когда результат операции невозможно точно представить в формате приемника. Например, при делении 1 на 3 получается бесконечная дробь;
2. Численное антипереполнение. Ненулевой результат слишком мал по абсолютной величине для представления в формате приемника. Например, при делении 1 на максимальное число с расширенной точностью 1.2*104932 получается очень маленькое число, которое не может быть представлено в формате с расширенной точностью. В данном случае результатом является денормализованное число. Денормализованными называются числа с плавающей точкой, имеющие в поле порядка все нули и нулевой старший бит мантиссы.
3. Денормализованный операнд. Возникает, когда операндом команды оказывается денормализованное число.
4. Деление на ноль. Результатом операции является бесконечность.
5. Численное переполнение. Возникает, когда результат слишком велик по абсолютной величине, чтобы быть представленным в формате приемника. Например, при сложении двух максимальных чисел в формате с расширенной точностью.
6. Недействительная операция. Включает в себя все арифметические операции, при которых нет приемлемого результата. Например, при делении нуля на ноль, при извлечении квадратного корня из отрицательного числа.
Обычная обработка особых случаев заключается в том, чтобы немедленно остановить операцию и передать управление процедуре обработки особого случая (внутреннего прерывания процессора).
Второй подход состоит в том, чтобы заставить операцию возвратить специальное значение особого случая и продолжить вычисления.
Оба подхода применяются в арифметическом сопроцессоре, программист может сам выбрать режим обработки особых случаев вещественной арифметики. При инициализации сопроцессора по умолчанию устанавливается режим формирования специальных значений. Для формирования специальных значений можно использовать числа с минимальными и максимальными значениями порядков в каждом формате, что не сильно сокращает диапазон значений нормализованных чисел. Кроме того, наборы специальных значений выбраны так, что большинство сравнений на равенство или неравенство выполняется правильно (эти сравнения редки для плавающей арифметики). Сделано это для того, чтобы при получении в качестве промежуточных результатов специальных значений, программа имела возможность сформировать правильный окончательный результат.
В качестве специального значения используется приближенное значение числа с плавающей точкой. Существуют четыре режима округления:
в направлении к 0 (обычно для целочисленной арифметики);
до ближайшего числа (если результат посередине, то выбирается ближайшее четное число).
округление к + ¥
округление к - ¥
Режимы c) и d) используются для реализации интервальной арифметики : операция выполняется дважды: с округлением к +¥ и с округлением к-¥. Истинный результат находится между двумя результатами, следовательно не требуется анализ ошибок округления. При инициализации сопроцессора по умолчанию устанавливается режим округления к ближайшему числу, однако программист может его изменить.
Принято соглашение, что для денормализованного числа поле порядка 00..00 считается равным 00...01, но старший бит мантиссы равен 0 (а не 1). Для одинарной точности смещение равно 127, следовательно, поле порядка 00000001 соответствует порядку - 126.
Пример :
Знак |
Порядок |
Старший бит мантиссы |
Мантисса 23 бита |
|
0 |
00000001 |
1 |
10...00 |
= 1.12*2-126 - норм. |
0 |
00000001 |
1 |
00...00 |
=1.02*2-126 - норм. |
0 |
00000000 |
0 |
10...00 |
=0.12*2-126 - денорм. |
0 |
00000000 |
0 |
01...00 |
=0.12*2-127 - денорм. |
............ |
................ |
................................. |
||
0 |
00000000 |
0 |
00...01 |
=0.12*2-149 денорм. |
Точность минимального числа равна 1 биту, то есть происходит потеря точности ради расширения диапазона. Специальное значение - денормализованное число, а если результат мал для денормализованого числа, то в качестве результата формируется нуль.
На числовой оси плотность представимых чисел выше у нуля и ниже у максимальных значений.
+++++++ |
++-+++-+++-+ |
++-++-++-+-+-+-+-+- |
+- -+- -+- - -+- - -+ |
0 Денорм. |
Нормализованные числа |
Для денормализованных операндов выполняются следующие правила формирования результатов операций:
Результат равен 0, если он слишком мал для представления денормализованным числом (например, при умножении двух денормализованных чисел).
Результат - денормализованное число, если он представим в формате денормализованных чисел ( например, при сложении двух денормализованных чисел).
Результат - нормализованное число, если неточность денормализованного числа влияет на результат меньше, чем ошибка округления (например, при сложении денормализованного и большого нормализованного числа).
Результат - ненормализованное число, если результат слишком велик для денормализованного числа, неточный, а приемник имеет расширенную точность (например, при сложении денормализованного и большого нормализованного числа).
Ненормализованным числом называется число с расширенной точностью, имеющее обычное (ненулевое и неединичное) поле порядка и нулевой старший бит мантиссы.
Ненормализованные операнды в операциях подчиняются правилам для денормализованных чисел. Особый вид ненормализованного числа - псевдоноль. Псевдоноль имеет ненулевое поле порядка и нулевую мантиссу. В сравнениях псевдонули считаются нулями. Данный формат чисел поддерживается сопроцессором модели 80287 и не поддерживается моделью 80387 и устройством с плавающей точкой процессора 80486 и последующих моделей, так как уточнился стандарт представления чисел с плавающей точкой.
Результат - особый случай недействительной операции (наример, при делении на денормализированное число или попытке извлечения квадратного корня из денормализованного числа).
Бесконечность - число, имеющее в поле порядка все единицы, а в поле мантиссы - все нули . Единица в старшем разряде хранится явно в расширенном формате. Так как поле знака может быть равным единице или нулю, то существуют положительная и отрицательная бесконечности.
Если x - конечное положительное число, не равное нулю, то разрешены следующие операции с бесконечностью:
1) x : + 0 = + ¥
- x : + 0 = - ¥
x : - 0 = - ¥
- x : - 0 = + ¥
2) x : + ¥ = + 0
- x : + ¥ = - 0
x : - ¥ = - 0
- x : - = +0
3) x *+ ¥ = + ¥
- x * + ¥ = - ¥
x * - ¥ = - ¥
x * - ¥ = + ¥
4) + ¥ : x = + ¥
+ ¥ : - x = - ¥
¥ : x = - ¥
¥ : - x = + ¥
5) + ¥ * + ¥ = + ¥
+ ¥ * - ¥ = - ¥
- ¥ * + ¥ = - ¥
- ¥ * - ¥ = - ¥
Запрещены следующие операции с бесконечностью (в качестве результата они дают особый случай недействительной операции ):
Для операций сложения, вычитания и сравнения бесконечностей появляются трудности. Математический сопроцессор 80287 имеет два режима управления бесконечностью : проективный и аффинный.
В проективном режиме - скрыт факт наличия двух бесконечностей и двух нулей. Сравнение бесконечности с конечным числом в качестве результата вызывает особый случай недействительной операции, сравнение двух бесконечностей дает результат “равны”. Сложение и вычитание бесконечностей дает в результате особый случай недействительной операции. Сложение и вычитание бесконечности и конечного числа дает в результате бесконечность.
В аффинном режиме существуют положительная и отрицательная бесконечности и существуют положительный и отрицательный нули. Этот режим разрешает сложение бесконечностей с одинаковыми знаками и вычитание бесконечностей с разными знаками:
(+ ) + (+ ) = + ;
(- ) - (+ ) = - .
В аффинном режиме также разрешены сложение и вычитание бесконечности и конечного числа, сравнение конечного числа с бесконечностью и сравнение бесконечностей друг с другом.
Проективный режим упразднен, начиная с математического сопроцессора 80387, у него и последующих версий устройства с плавающей точкой существует только аффинный режим управления бесконечностью.
Численное переполнение наступает тогда, когда результат превышает наибольшее конечное число в формате приемника. Переполнение опасно, так как знак может оказаться неверным, а результат будет не бесконечность, а слишком большое для представления число.
Пример: деление большого числа на малое число (близкое к 0). Знак результата будет зависеть от знака малого числа, хотя он может быть неверным в результате ошибки округления.
Специальное значение формируется в зависимости от режима округления, установленного в регистре управления сопроцессора:
1) если установлен режим округления к ближайшему числу - то результат- плюс или минус бесконечность;
2) если установлен режим округления к минус бесконечности, то для положительных чисел результат - максимальное число больше нуля, для отрицательных чисел - минус бесконечность;
3) если установлен режим округления к плюс бесконечности, то для положительных чисел результат плюс бесконечность, а для отрицательных чисел - максимальное число меньше нуля;
4) если установлен режим округления к нулю, то для положительных чисел результат - максимальное число больше нуля, для отрицательных чисел - максимальное число меньше нуля.
Возникает, когда нет приемлемого результата в арифметической операции, операции сравнения или при стековых операциях (при этом флаг SF в регистре состояния равен единице):
при реализации операций сложения, вычитания, умножения и деления может возникнуть особый случай недействительной операции (например, при запрещенных операциях с бесконечностью);
- при реализации операции сравнения результатом является код условия. Обычно он показывает отношения “<”, “=”, “>”. Если при этом возникает особый случай недействительной операции (например, в проективном режиме при сравнении бесконечности и конечного числа, или при сравнении нечисла и конечного числа), то код условия принимает специальное значение “не сравнимы”. При этом нарушается закон трихотомии арифметики : . Это вызывает трудности в языках высокого уровня при исполнении оператора IF, так как, например, отрицанием условия больше или равно является не только меньше, но и “не сравнимы”;.
особый случай стека: переполнение, то есть попытка включения числа в заполненный стек или антипереполнение, то есть попытка извлечения числа из пустого стека;
Во всех случаях результатом недействительной операции будет нечисло (NAN).
Нечисло это двоичное вещественное число, у которого в поле порядка все единицы, а в поле мантиссы - все, кроме значения, зарезервированного за бесконечностью, то есть 1.000000...0.
Если один или оба операнда в операции -нечисло - то результатом тоже является нечисло. Таким образом, полученное в промежуточном результате операции нечисло распространяется в вычислениях и выдается как окончательный результат.
Особый случай нечисла - неопределенность. Сопроцессор формирует неопределенность как результат недействительной операции (остальные нечисла формируются программистом).
Для вещественных чисел неопределенность - это нечисло у которого в поле мантиссы две старшие цифры единицы, а все остальные нули (1.1...00), а поле порядка одни единицы (11...11). Поле знака также равно единице.
Для формата десятичных чисел неопределенность имеет следующее представление :
Знак |
1 |
2 |
3 |
4 |
мусор |
79 |
75 - 78 |
71 - 74 |
67 - 70 |
63 - 66 |
0 - 62 |
1 |
1111 |
1111 |
1111 |
1111 |
хх...хх |
Десятичную неопределенность нельзя преобразовать в вещественное число, результат при этом - неопределенность.
Для двоичных целых форматов неопределенность представляется максимальным по модулю отрицательным числом, то есть имеет код
1 |
0000...00 |
Знак |
Целочисленная неопределенность при преобразовании в формат с плавающей точкой дает обычное отрицательное число.
Попытка преобразования нечисла, денормализованного, ненормализованного числа или бесконечности в формат целых чисел вызывает особый случай недействительной операции, результатом которой и является неопределенность.
Предназначен для выполнения вычислительных операций. Регистровый стек состоит из восьми регистров по 80 бит каждый, в которых представлены вещественные числа в расширенном формате. Адресация численных регистров реализована следующим образом: логический номер регистра, указанного в команде, процессор суммирует с содержимым поля ST (вершина стека) в регистре состояний. Сумма по модулю 8 определяет используемый численный регистр. Для удобства математических расчетов код и результат операции могут замещать значения операндов и использоваться дальше в вычислениях.
101 |
79 |
78 |
63 |
0 |
|||
ST |
5 |
R0 |
S |
E |
M |
ST(3) |
|
R1 |
ST(4) |
||||||
в слове |
R2 |
ST(5) |
|||||
Состояния |
R3 |
ST(6) |
|||||
R4 |
ST(7) |
||||||
R5 |
Вершина |
ST(0) или ST |
|||||
R6 |
ST(1) |
||||||
R7 |
ST(2) |
Числовой стек имеет кольцевую организацию. Если стек заполнен полностью, то есть ST = 111, то операция включения в стек вызывает перезапись в вершину стека ST = 000 ( при обработке особых случаев сопроцессора посредством обращения к системе пррываний центрального процессора) или особый случай недействительной операции (при формировании специальных значений в особых случаях сопроцессора).
Предназначен для управления работой сопроцессора. Имеет размер 16 бит.
15 13 |
12 |
11-10 |
9-8 |
7 6 |
5 |
4 |
3 |
2 |
1 |
0 |
IC |
RC |
PC |
PM |
UM |
OM |
ZM |
DM |
IM |
||
IM -маска недействительной операции |
= 0 - прерывания |
|||||||||
DM -маска денормализованного операнда |
разрешены |
|||||||||
ZM -маска деления на нуль |
= 1 формирование |
|||||||||
OM -маска переполнения |
специальных значений |
|||||||||
UM -маска антипереполнения |
||||||||||
PM -маска неточного результата |
PC - поле управления точностью:
11 - расширенная точность (по умолчанию);
10 - двойная точность;
00 - одинарная точность.
RC - поле управления округлением:
00 - к ближайшему числу (по умолчанию);
01 - округление к минус бесконечности;
10 - округление к плюс бесконечности;
11 - округление к нулю.
IC - поле управления бесконечностью: (для 80287)
0 - проективный режим (по умолчанию);
1 - аффинный режим.
С 80387 не используется - по умолчанию всегда аффинный режим.
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
B |
C3 |
ST |
C2 |
C1 |
C0 |
ES |
SF |
PE |
UE |
OE |
ZE |
DE |
IF |
||
Флагстека |
флаги особых случаев |
Флаги (0-6 биты):
IE - недействительная операция;
DE - денормализованный операнд;
ZE - деление на нуль;
OE переполнение;
UE антипереполнение;
PE - точность (неточный результат);
SF- флаг стека (с 80387 сопроцессора).
При возникновении особого случая, не зависимо от того, замаскирован он или нет, автоматически выставляется флаг особого случая, равный единице. Явно сбросить флаги должен программист, загружая в регистр состояния новое значение соответствующих флагов.
ES - бит суммарной ошибки, устанавливается в единицу, когда команда порождает любой особый случай. C0, C1, C2, C3 - коды условий, являющиеся результатом сравнения или команды нахождения остатка. Интерпретация кодов условий зависит от конкретной команды.
ST - поле вершины стека, содержит физический номер регистра, являющийся вершиной стека.
B - бит занятости, равен единице, когда процессор выполняет команду или сигнализирует прерывание, если сопроцессор свободен, то B равен нулю. Бит занятости показывает занятость численного операционного устройства сопроцессора, в которое входит числовой стек и регистр тэгов.
15 |
1413 |
1211 |
109 |
87 |
65 |
43 |
21 |
0 |
ТэгR7 |
ТэгR6 |
ТэгR5 |
ТэгR4 |
ТэгR3 |
ТэгR2 |
ТэгR1 |
ТэгR0 |
Каждое поле соответствует состоянию численного регистра (соответствие устанавливается на уровне физических имен регистров - RO:R7):
00 в регистре действительное число (любое конечное число , не равное нулю, ненормализованное число считается действительным в 80287);
01 нуль;
10 - недействительное число (нечисло, бесконечность, денормализованное число или ненормализованное число в 80387 и последующих версиях устройства с плавающей точкой);
11 - пустой регистр.
Регистр считается пустым, если он не был инициализирован, или его содержимое было “извлечено” из стека. Процессор использует это состояние тэга для обнаружения переполнения стека (слишком много включений) или антипереполнения стека (слишком много извлечений). При попытке извлечь число из пустого регистра возникает особый случай недействительной операции. Когда этот особый случай замаскирован (прерывания запрещены), процессор корректирует ST обычным способом и возвращает неопределенность как результат операции.
Предназначены для процедур обработки особых случаев. Они имеют два формата в зависимости от работы 80287 в реальном или защищенном режиме.
Реальный режим |
Защищенный режим |
||||
15 |
0 |
31 387 |
15 |
0 |
|
Адрес команды (0-15) |
смещ. |
Смещение команды |
|||
адрес ком 16-19 |
код операции 0-10 |
Селектор команды |
|||
Адрес операнда (0-15) |
смещ. |
Смещение операнда |
|||
Адрес опер 16-19 |
Селектор операнда |
||||
15 |
12 |
11 |
0 |
||
20-разрядные адреса команды и операнда и 11 младших разрядов кода операции |
Селектор плюс смещение подозрительной команды и ее операнда |
ТИП КОМАНДЫ |
МНЕМОНИКА И ФОРМАТ |
ОПЕРАНД/ДЕЙСТВИЕ |
КОМАНДЫ ЗАГРУЗКИ В СТЕК |
FLD REG/MEM |
Вещественное число |
FILD MEM |
Целое число |
|
FBLD MEM |
Десятичное число |
|
КОМАНДЫ ИЗВЛЕЧЕНИЯ ИЗ СТЕКА |
FSTP REG/MEM |
Вещественное число |
FISTP MEM |
Целое число |
|
FBSTP MEM |
Десятичное число |
|
КОМАНДЫ КОПИРОВАНИЯ |
FST REG/MEM |
Вещественное число |
FIST MEM |
Целое число |
|
КОМАНДА ОБМЕНА |
FXGH REG |
Обмен содержимым между регистрами стека |
КОМАНДЫ ЗАГРУЗКИ КОНСТАНТ |
FLDZ |
Загрузка 0 |
FLD1 |
Загрузка 1 |
|
FLDPI |
Загрузка |
|
FLDLG2 |
Загрузка log по основанию 10 из 2 |
|
FLDLN2 |
Загрузка ln 2 |
|
FLDL2T |
Загрузка log по основанию 2 из 10 |
|
FLDL2E |
Загрузка log по основанию 2 из Е |
КОМАНДЫ ЗАГРУЗКИ все команды однооперандные, записывают в вершину стека заданный операнд. При загрузке операнд преобразуется в формат с заданной точностью, значение поля ST в регистре состояния уменьшается на единицу и операнд записывается в новую вершину стека. Преобразование формата осуществляется в соответствии с полем PC регистра управления.
КОМАНДЫ ИЗВЛЕЧЕНИЯ - все команды однооперандные, извлекают содержимое вершины стека и запоминают его в операнд-приемник. При этом содержимое вершины стека преобразуется в формат приемника, значение поля ST в регистре состояния увеличивается на единицу. Преобразование формата для двоичных чисел выполняется в соответствии с полем RC регистра управления, для десятичных чисел - путем суммирования числа и 0.5 и отбрасывания дробной части результата.
КОМАНДЫ КОПИРОВАНИЯ - все команды однооперандные, копируют содержимое вершины стека в операнд-приемник. При этом содержимое вершины стека преобразуется в формат приемника аналогично командам извлечения. Поле вершины стека данными командами не изменяется.
КОМАНДА ОБМЕНА - однооперандная команда, предназначена для обмена содержимого вершины стека и другого численного регистра. Поле вершины стека не изменяется.
КОМАНДЫ ЗАГРУЗКИ КОНСТАНТ - безоперандные команды, предназначены для быстрой загрузки констант в вершину стека. Поле вершины стека уменьшается на единицу.
Коды операций всех команд начинаются с бит 11011, которые соответствуют коду команды ESC в основном процессоре (заставляет извлечь содержимое указанного в ней операнда и передать его на шину данных). Ассемблерная мнемоника команд сопроцессора начинается с буквы F.
Для безоперандных арифметических команд операндами по умолчанию являются регистры ST(0), ST(1). Для однооперандных арифметических команд - один из операндов - это вершина стека ST(0).
Для всех арифметических команд существуют обычные (прямые) формы команд: FADD, FSUB, FMUL, FDIV , а для команд вычитания и деления существуют ещё и обратные формы команд: FSUBR , FDIVR.
Для обратных форм команд выполняется следующая схема:
источник - приемник=приемник или источник / приемник = приемник. Для прямых команд уменьшаемое или делимое берется из приемника.
Существует шесть форм команд:
FXXX;
FXXX память;
FIXXX память;
FXXX ST(0), ST(i);
FXXX ST(i), ST(0);
FXXXP ST(i), ST(0).
Здесь ХХХ- мнемокод арифметической команды.
При реализации команд первого типа процессор извлекает из стека два верхних операнда, а затем включает в стек результат операции. В результате указатель вершины стека увеличивается на единицу.
При реализации команд второго типа операнд в памяти (одинарной или двойной точности) является источником, а регистр ST(0)- приемником. Результат записывается в вершину стека , то есть указатель вершины стека не изменяется.
Реализации команд третьего типа присходит аналогично командам второго типа, но операнды в памяти целые (16 или 32 бита).
При реализации команд четвертого типа любой регистр ST(i) служит источником, а вершина стека приемником, при этом указатель вершины стека не изменяется.
При реализации команд пятого типа любой регистр ST(i) служит приемником, а вершина стека - источником, при этом указатель вершигы стека не изменяется.
При реализации команд шестого типа любой регистр ST(i) служит приемником, а вершина стека - источником, по окончании операции источник извлекается из стека, то есть указатель вершины стека увеличивается на единицу.
Арифметические операции над целыми числами выполняется медленнее, чем в основном процессоре.
МНЕМОКОД |
ОПИСАНИЕ |
FSQRT |
Извлечение квадратного корня |
FSCALE |
Масштабирование на степень 2 |
FPREM |
Нахождение частичного остатка |
FPREM1 |
Нахождение остатка |
FRNDINT |
Округление до целого |
FXTRACT |
Выделение порядка и мантиссы |
FABS |
Нахождение абсолютной величины |
FCHS |
Изменение знака |
FSQRT:- извлекает квадратный корень из ST(0) и записывает результат в ST(0). При попытке извлечения корня из отрицательного числа возникает особый случай недействительной операции. Начиная с процессора 80486, разрешены операции : .
FSCALE: . Если ST(1) не целое и больше 1 по абсолютной величине, то берется ближайшее меньшее целое, если ST(1) меньше 1 или находится вне диапазона, то результат неопределенный, особый случай не генерируется. Начиная с сопроцессора 80387 ограничений на операнды команды нет.
FXTRACT: разлагает ST(0) на два числа с плавающей точкой: несмещенный порядок и знаковую мантиссу. Порядок заменяет старое значение ST(0), а мантисса включается сверху, то есть указатель стека уменьшается на единицу. Порядок истинный, в форме вещественного числа.
FRNDINT: округляет ST(0) до целого числа в формате с плавающей точкой согласно полю RC регистра состояния.
FABS: заменяет содержимое регистра ST(0) на его абсолютное значение (изменяет знаковый разряд).
FCHS: инвертирует знак содержимого ST(0).
FPREM: вычисляет остаток от деления содержимого ST(0) на число из ST(1), знак остатка совпадает со знаком ST(0). Остаток заменяет содержимое ST(0). FPREM формирует частичный остаток, так как операция может прекратиться, не завершив операции деления. FPREM работает, производя повторяющиеся машинные вычитания, при этом производится не более 64 вычитаний. Если 64 вычитания достаточно, чтобы число ST(0) < ST(1), то в ST(0) будет находится истинный остаток, а бит С2 кода условия сбрасывается в нуль. Если 64 вычитаний недостаточно, то С2 устанавливается в единицу, а в ST(0) находится уменьшенный результат после 64 вычитаний. С2 проверяется командой JP, после передачи регистра состояния в AX и командой SAHF. Повторное вычитание FPREM до образования С2 = 0 дает точный остаток. 64 вычитания делают для того, чтобы между повторными исполнениями команды можно было прервать сопроцессор (64 вычитания гарантируют, что FPREM не будет длиться дольше команды деления, то есть не превысит длительности максимальной по времени команды). Применяется в основном в вычислениях тригонометрических функций.
FPREM1 (введена в систему команд для сопроцессора 80387): вычисляет величину REM = ST - ST(1)*Q, где Q целая часть числа ST/ST(1); С0,С3,С2 содержат младшие три бита частного.
МНЕМОНИКА |
ОПИСАНИЕ |
FCOM операнд/(без операндов) |
Сравнение |
FICOM операнд |
Целочисленное сравнение |
FCOMP операнд/(без операндов) |
Сравнение с извлечением из списка |
FICOMP операнд |
Целочисленное сравнение с извлечением |
FCOMPP (без операндов) |
Сравнение и двойное извлечение |
FTST (без операндов) |
Сравнение с нулем |
FXAM (без операндов) |
Анализ |
FUCOM (без операндов) |
Сравнение мантисс операндов |
FUCOMP (без операндов) |
Сравнение мантисс операндов с извлечением |
FUCOMPP (без операндов) |
Сравнение мантисс операндов с двойным извлечением |
Во всех операциях сравнения всегда существует ST(0), поэтому требуется один операнд, если нет операндов, то второй операнд берется из ST(1).
FCOM X сравнивает содержимое ST(0) с операндом X и устанавливает следующие коды условия :
Условие сравнения |
С3 |
С2 |
С0 |
ST(0) > X |
0 |
0 |
0 |
ST(0) < X |
0 |
0 |
1 |
ST(0) = X |
1 |
0 |
0 |
ST(0) и X “не сравнимы” |
1 |
1 |
1 |
Х- численный регистр, или число в памяти одинарной или двойной точности. Указатель вершины стека - не изменяется.
FCOM - без операндов - это FCOM ST(1).
FCOMP - это FCOMP ST(1) и извлекается из стека содержимое регистра ST(0), то есть указатель вершины стека уменьшается на единицу.
FCOMPP это FCOMPP ST(1) и извлекается из стека содержимое регистров ST(0) и ST(1), то есть указатель вершины стека уменьшается на два.
FICOM - аналогична FCOM, но операндом является целое число (16 или 32 бита) в памяти.
FCOMP - аналогична FCOM, но после операции сравнения производится одно извлечение из стека, то есть указатель вершины стека уменьшается на единицу.
FICOMP - аналогична FCOMP для целых чисел
FCOMPP (без операндов) действует как FCOM (без операндов), но после сравнения она извлекает из стека оба операнда, то есть указатель вершины стека уменьшается на два.
FTST сравнивает нулем и устанавливает следующие коды условия:
Условие сравнения |
С3 |
С2 |
С0 |
ST(0) > 0 |
0 |
0 |
0 |
ST(0) < 0 |
0 |
0 |
1 |
ST(0) = 0 |
1 |
0 |
0 |
ST(0) и 0 “не сравнимы” |
1 |
1 |
1 |
FXAM - аналогична FTST, но установка кодов условий другая:
С1 = 0 |
С1 = 1 |
ST(0) >0 |
ST(0) <0 |
С0 = 0 |
С0 = 1 |
ST(0) конечное |
ST(0) не конечное |
С3 |
С2 |
С3 |
С2 |
|||
0 |
0 |
ненормализованное |
0 |
0 |
нечисло |
|
0 |
1 |
нормализованное |
0 |
1 |
бесконечность |
|
1 |
0 |
0 |
1 |
0 |
пустой регистр |
|
1 |
1 |
денормализованное |
1 |
1 |
пустой регистр |
FXAM выполняется примерно в два раза быстрее чем FTST.
Команды сравнения FPU 80486.
FUCOM, FUCOMP, FUCOMPP - сравнивают мантиссы. Допускается сравнение нечисел.
Бит С2 = 1, если один или оба операнда - нечисла, а биты С0 и С3 устанавливает соотношение между мантиссами.
- безоперандные- сравнивают ST(0) и ST(1).
Коды условий после команд сравнения мантисс:
С3 |
С2 |
С0 |
|
0 |
1 |
0 |
ST(0) > 0 |
0 |
1 |
1 |
ST(0) < 0 |
1 |
1 |
0 |
ST(0) = 0 |
1 |
1 |
1 |
? |
Как используются коды условий сопроцессора для условных переходов основного процессора?
Ассемблерная команда сопроцессора FSTSW AX копирует содержимое регистра состояния сопроцессора в регистр AX основного процессора.
Затем коды условий проверяются в среде основного процессора.
Команда SAHF (запомнить AH во флагах) позволяет получить следующий результат:
SF |
ZF |
AF |
PF |
CF |
SAHF |
|||
15 |
8 |
|||||||
B |
C3 |
ST |
C2 |
C1 |
C0 |
FSTW AX |
Результат FCOM по установке флажков такой же, как и у команды CMP основного процессора за исключением условия “не сравнимы”.
FCOM FSTSW AX FWAIT, если нет FPU SAHF JE MET |
Переход к MET, если ST(0) = ST(1) Команды JE, JNE, JA, JAE, JB, JBE, JP, JNP, JC, JNC, JZ, JNZ можно использовать для условных переходов |
МНЕМОНИКА |
ОПИСАНИЕ |
FPTAN |
Частичный tg |
FPATAN |
Частичный arctg |
FYL2X |
y*log2(x) |
FYL2XP1 |
y*log2(x) |
F2XM1 |
2x-1 |
FPTAN дает в качестве результата два таких числа х и у, что у/х=tg (ST(0)). У - заменяет старое содержимое ST(0), а х включается сверху.
Для модели математического сопроцессора 80287 аргумент команды FPTAN должен быть нормализован; денормализованные и ненормализованные числа, бесконечность и нечисла недопустимы в качестве аргументов у всех трансцендентных команд. Кроме того, аргумент должен находиться в диапазоне 0<ST(0)</4. Если аргумент недопустим или находится вне диапазона, FPTAN дает неправильный результат, не сигнализируя об особом случае (то же самое верно и для других трансцендентных команд). Программист сам должен заботится о допустимости аргумента и приведении его в диапазон. Допустимость может быть проверена с помощью команды FXAM. Для модели математического сопроцессора 80387 и устройств FPU команда FPTAN в ST(1) возвращает тангенс исходного угла, а в ST(0) возвращается единица. Сделано так из-за совместимости с сопроцессором 80287.
FPATAN - вычисляет ST(0)=arctg (ST(1)/ST(0)). Два верхних элемента извлекаются из стека, результат включается в стек. Упрощает вычисление остальных тригонометрических функций. Для аргументов должно выполняться следующее условие: 0<ST(1)<ST(0)< для модели математического сопроцессора 80287, с модели математического сопроцессора 80387 ограничений на аргумент нет.
FYL2X - вычисляет функцию ST(0) = ST(1)*log2ST(0). Два операнда извлекаются из стека, а затем результат включается в стек. Условие для аргументов ST(0) > 0 должно быть выполнено.
FYL2XP1 - вычисляет функцию ST(0) = ST(1)*log2(ST(0)+1). Должно быть выполнено следующее условие: . Причина появления этой команды - более высокая точность вычисления функции log2(1+x) при малых х. Удобна для вычисления обратных гиперболических функций.
F2XM1 вычисляет ST(0) = 2ST(0)-1, причем ST(0) должно находиться в диапазоне: 0 < ST(0) < 0.5 модели математического сопроцессора 80287. Для модели математического сопроцессора 80387 и устройств FPU условие для аргумента функции -1 < ST(0) < +1. Вычисление 2х-1 вместо 2х позволяет избежать потери точности, при х близких к нулю (при этом 2х близко к 1). Удобна для вычисления гиперболических функций.
Новые трансцендентные команды
Для модели математического сопроцессора 80387 были разработаны новые трансцендентные команды:
FSIN - без операндов. Вычисляет синус действительного числа из вершины стека, результат записывается в вершину стека. Для величины угла нет ограничений.
FSINCOS - без операндов. Одновременно вычисляет синус и косинус угла в вершине стека. Синус - в ST(1), косинус- в ST(0). Ограничений величины угла нет.
FCOS - без операндов. Вычисляет косинус действительного числа из вершины стека. Результат помещается в новую вершину стека. Ограничений величины угла нет.
Эта группа команд обеспечивает управление режимом работы сопроцессора. Для программиста особенно интересны команды работы с регистрами управления и состояния.
МНЕМОНИКА |
ОПИСАНИЕ КОМАНДЫ |
FNSTCW(FSTCW) |
Запомнить регистр управления |
FLDCW |
Загрузить регистр управления |
FNSTSW(FSTSW) |
Запомнить регистр состояния |
FNSTSW AX(FSTSW AX) |
Запомнить регистр состояния в АХ |
FNCLEX(FCLEX) |
Сбросить особые случаи |
FNINIT(FINIT) |
Инициализировать сопроцессор |
FNSTENV(FSTENV) |
Запомнить среду |
FLDENV |
Загрузить среду |
FNSAVE(FSAVE) |
Запомнить полное состояние |
FRSTOR |
Восстановить полное состояние |
FINCSTP |
INC указателя стека |
FDECSTP |
DEC указателя стека |
FFREE |
Освободить регистр |
FNOP |
Нет операции FWAIT - ожидание |
FSETPM |
Установить защищенный режим |
FENI(FNENI) |
Разрешить прерывания (IEM = 0) |
FDISI(FNDISI) |
Запретить прерывания (IEM = 1) |
FNSTCW (FSTCW) - содержимое регистра управления записывается в ячейку памяти, указанную в качестве операнда.
FLDCW - загружает регистр управления из ячейки памяти, указанной в качестве операнда.
Эти команды применяются для изменения режима работы сопроцессора (можно переопределять режим округления, управления бесконечностью, маскирование особых случаев).
FNSTSW (FSTSW) - передает содержимое регистра состояния в ячейку памяти, указанную в качестве операнда. FNSTSW AX (FSTSW AX) передает содержимое регистра состояния в регистр АХ основного процессора.
FNCLEX (FCLEX) - сбрасывает (устанавливает в нуль) флажки всех особых случаев и биты ES и B в регистре состояния.
FNINIT (FINIT) - инициализирует регистры : управления, состояния и тэгов (такое же действие производит аппаратный сигнал сброса):
Регистр управления :
режим управления бесконечностью для модели математического сопроцессора 80287 проективный, для последующих моделей - аффинный;
режим округления - округление к ближайшему числу;
режим точности - расширенная точность;
все особые случаи - замаскированы (то есть формируются специальные значения).
Регистр состояния :
a) В = 0 (не занят)
b) C0 C1 C2 C3 - не определены
c) ST = 0
d) ES = 0
e) флаги особых случаев = 0
Все тэги = 11 (“пустые”)
FNSTENV (FSTENV) - записывает в память содержимое регистров управления, состояния, тэгов и указателей особого случая, начиная с адреса указателя в операнде. Формат информации в памяти следующий :
15 бит |
0 бит |
|
Регистр управления |
0 (смещение от начала) |
|
Регистр состояния |
2 |
|
Регистр тэгов |
4 |
|
Указатель команды |
6 |
|
Указатель операнда |
10 старший адрес |
FLDENV - загружает среду, ранее запомненную FNSTENV. Эти команды применяются в процедурах обработки особых случаев, чтобы получить доступ к указателям особого случая.
FNSAVE (FSAVE) действует аналогично FNSTENV, но дополнительно сохраняет в памяти содержимое численных регистров, располагая их после указателя операнда :
ST(0) |
14 |
ST(1) |
24 |
ST(2) |
34 |
ST(3) |
44 |
ST(4) |
54 |
ST(5) |
64 |
ST(6) |
74 |
ST(7) |
84 |
FRSTOR восстанавливает все регистры сопроцессора из памяти. Эта команды в основном применяется для переключения задач ( в защищенном режиме). Обратная ей команда FSAVE.
FINCSTP и FDECSTP - осуществляют инкремент или декремент указателя стека. Не влияют на регистр тэгов и численные регистры, не эквивалентны командам извлечения или включения в стек.
FFREE ST(i) - устанавливают тэг регистра ST(i) в состояние “пустой” (11), но содержание численного регистра не изменяют.
FNOP - не производит никакой операции, действует как FST ST(0), ST(0).
FENI и FDISI- не используются с сопроцессора 80387.
FSETPM - переводит сопроцессор в защищенный режим.
Аппаратный сброс переводит основной процессор и сопроцессор в реальный режим. Команды с мнемоникой FNXXX не проверяют незамаскированные особые случаи (если прерывания разрешены) и выполняется немедленно. В таком случае ассемблер автоматически не вставляет перед ней команду FWAIT, то есть не проверяет наличия особого случая сопроцессора. Все остальные команды синхронизируются автоматически.
Выборку команд из общей очереди команд осуществляет центральный процессор. Если выбранная команда оказывается командой центрального процессора, он выполняет ее обычным образом, сопроцессор такие команды игнорирует. Если выбирается команда сопроцессора, действия центрального процессора зависят от специфики конкретной команды. Если команда не связана с обращением к памяти, центральный процессор ее игнорирует и переходит к следующей команде. Если команда требует обращения к памяти, центральный процессор вычисляет физический адрес операнда и обращается к памяти, при этом сопроцессор перехватывает с общей шины адреса физический адрес операнда, а в операции со считыванием из памяти - еще и данные с общей шины данных. После этого сопроцессор выполняет команду. Выполнение команды сопроцессором происходит параллельно с работой центрального процессора, что повышает эффективность системы. Существуют случаи, когда требуется синхронизация действий двух процессоров :
Если сопроцессор занят выполнением команды, а центральный процессор выбирает для выполнения следующую команду - опять команду сопроцессора, то центральный процессор не должен ее передавать сопроцессору, а должен подождать. Следовательно, перед каждой командой сопроцессора в программе должна быть специальная команда центрального процессора, которая проверяет занятость сопроцессора и переводит его в состояние ожидания, если надо. Такой командой является команда FWAIT, а вставляет ее ассемблер (или компилятор языка высокого уровня).
Команда FWAIT не вставляется перед административными командами в мнемокоде которых есть буква N, FNXXX... Это так называемые команды без ожидания.
Происходит это по следующей схеме (см. рисунок 1). Некоторые административные команды могут выполняться устройством управления, а не численным операционным устройством. Поэтому перед такими командами не надо проверять бит B в регистре состояния, который показывает занятость численного операционного устройства.
Данными командами следует пользоваться аккуратно, так как. они не вызывают обработчика особых случаев через систему прерываний, то есть не проверяют наличие сигнала прерывания от сопроцессора, а если он произошел, то процесс восстановления из прерывания не произойдет, так как. выполнение команды управления может помешать процедурам обработки определить причину особого случая и метод его обработки.
Структурная схема сопроцессора
Устройство управления |
Численное операционное устройство |
||||||
Регистр управления |
|||||||
Регистр состояния |
|||||||
Указатели ОС |
|||||||
Тэги |
Числовой стек |
Рисунок 4.1
Если сопроцессорная команда записывает операнд в ячейку памяти, а следующая команда центрального процессора использует этот операнд в дальнейших вычислениях, ЦП должен ожидать завершения операции сопроцессора. автоматически учесть такие ситуации сложно, поэтому вся работа по синхронизации в этом случае ложится на программиста. Для реализации этой синхронизации можно использовать команду FWAIT или любую другую “пустую” команду сопроцессора, например : FNOP, FST ST(0). В устройстве FPU - есть синхронизация по данным, которая автоматически реализуется ассемблером или компилятором языка высокого уровня.
Реализовать ввод элементов массива с контролем допустимых кодов символов и диапазона значений элементов массива. Вывести элементы полученных массивов на экран.
Вариант 1
Из исходного массива двузначных десятичных чисел со знаком получить два новых, поместив в первый из них значения элементов, превосходящих среднее значение массива, а во второй номера этих элементов (среднее = ).
Вариант 2
Из двух исходных массивов двузначных десятичных чисел без знака X и Y cформировать массив Z, поместив в него все элементы исходных, превышающие общее среднее = .
Вариант 3
Из исходного массива двузначных десятичных чисел со знаком получить два новых, поместив в первый из них номера максимальных, а во 2-ой номера минимальных элементов исходного. (Предполагается, что MIN и MAX могут быть не единственными).
Вариант 4
Найдите в массиве двузначных десятичных чисел без знака X все элементы и их номера и поместите эти значения в два новых массива Y - элементов и Z - индексов.
Вариант 5
Из исходного массива X двузначных десятичных чисел со знаком сформировать массив Y- отклонений от среднего
() и массив Z- номеров элементов исходного массива, превышающих среднее.
Вариант 6
Выявить все номера элементов массива двузначных десятичных чисел без знака X, превышающих (max+min)/2. В результате сформировать 2 массива: Y- масив номеров и Z- массив значений, для которых выполняется заданное условие.
Вариант 7
Из исходного массива двузначных десятичных чисел со знаком X получить новый массив Y ().
Подсчитайте среднее = .
Вариант 8
Из исходного массива двузначных десятичных чисел без знака получить два новых, поместив в них значения и номера элементов, для которых выполняется условие
Вариант 9
Из исходного массива двузначных десятичных чисел со знаком X получить два новых Y и Z, таких что:
Вариант 10
Получить из исходного массива X двузначных десятичных чисел без знака два новых Y, Z, поместив в них элементы и номера элементов массива X, для которых выполняется условие .
Вариант 11
Получить из исходного массива X двузначных десятичных чисел без знака два новых Y, Z, помеcтив в них номера элементов и их значения, для которых выполняется условие .
Вариант 12
Получить из исходного массива X двузначных десятичных чисел со знаком два новых Y, Z, поместив в них элементы и номера, для которых выполняется условие .
Вариант 13
Из исходного массива X двузначных десятичных чисел без знака получить два новых Y, Z, поместив в Y элементы, значения которых меньше (Xmax+Xmin)/ 2, а в Z - номера этих элементов.
Вариант 14
Из исходного массива X двузначных десятичных чисел со знаком получить два новых Y, Z, поместив в первый из них нечетные значения элементов массива, а во второй их номера.
Вариант 15
Из исходного X двузначных десятичных чисел без знака получить два новых Y, Z,, поместив в первый из них номера элементов превышающих заданное число А, а во второй - элементы, значения которых меньше среднего в массиве (среднее = ).
Вариант 16
Получить из исходного массива X двузначных десятичных чисел без знака два новых Y, Z, поместив в них элементы и номера, для которых выполняется условие x i <= xi-1 + xi+1.
Вариант 17
Из исходного массива двузначных десятичных чисел без знака X получить два новых Y и Z, таких что:
Вариант 18
Получить из исходного массива X двузначных десятичных чисел со знаком два новых Y, Z, поместив в них элементы и номера элементов массива X, для которых выполняется условие: xi <= xmax xmin.
Вариант 19
Получить из исходного массива X двузначных десятичных чисел со знаком два новых Y, Z, помеcтив в них номера элементов и их значения, для которых выполняется условие: xi < (xi-1 +xi +xi+1)/3.
Вариант 20
Получить из исходного массива X двузначных десятичных чисел без знака два новых Y, Z, поместив в них элементы и номера, для которых выполняется условие: xi <= xmax +xmin.
Вариант 21
Из исходного массива X двузначных десятичных чисел со знаком получить два новых Y, Z, поместив в Y элементы, значения которых меньше (xmax-xmin)/ 4, а в Z - номера этих элементов.
Вариант 22
Из исходного массива X двузначных десятичных чисел без знака получить два новых Y, Z, поместив в первый из них четные значения элементов массива, а во второй их номера.
Вариант 23
Из исходного X двузначных десятичных чисел со знаком получить два новых Y, Z,, поместив в первый из них номера элементов не превышающих заданное число А, а во второй - элементы, значения которых больше среднего в массиве (среднее = ).
Вариант 24
Получить из исходного массива X двузначных десятичных чисел со знаком два новых Y, Z, поместив в них элементы и номера, для которых выполняется условие x i = xi-1 + xi+1.
Вариант 25
Из исходного массива двузначных десятичных чисел без знака получить два новых, поместив в первый из них значения элементов, не превосходящих среднее значение массива, а во второй номера этих элементов (среднее = ).
Вариант 26
Из двух исходных массивов двузначных десятичных чисел со знаком X и Y cформировать массив Z, поместив в него все элементы исходных, не превышающие общее среднее = .
Ввести с клавиатуры границы интервала значений аргумента функции, перевести их в формат вещественного числа, рассчитать шаг и вычислить значение функции в заданном интервале. Вывести на экран график функции, таким образом, чтобы он весь умещался на экране, для чего произвести масштабирование вычисленных значений функции в соответствии с размерами экрана в выбранном графическом режиме.
;Программа очистки экрана через видеобуфер
.model small
.486
.stack 100h
.code
begin: mov ax,@data
mov ds,ax
mov ax,0b800h; адрес видеобуфера текстовых режимов
mov es,ax; настройка регистра es на видеобуфер
mov di,00h; настройка регистра di на начало видеобуфера
mov ax,0700h; определение атрибутов фона и символа: черный фон , белый символ
mov cx,2000; счетчик числа выводимых символов- выводим на экран 2000 пробелов
rep stosw
mov ax,4c00h; вызов функции завершения программы
int 21h
end begin
;*****************************************************************
;Программа демонстрации суммирования элементов двух массивов целых чисел
.model small
.486
.stack 100h
.data
M1 db 1,2,3,4,5; первый исходный массив
M2 db 6,7,8,9,10;второй исходный массив
M3 db 5 dup(0); массив результата
.code
begin:mov ax,@data; настройка сегментного регистра ds
mov ds,ax; на сегмент данных
xor di,di;обнуление индексного регистра
mov cx,5;определение счетчика цикла
met: mov al,M1[di];пересылка элемента М1 в регистр
add al,M2[di];суммирование элементов массивов
mov M3[di],al;запись в память результата
inc di; увеличение индекса элемента массива
loop met; возврат на цикл
kon: mov ah,4ch
int 21h
end begin
;*****************************************************************
;Программа перекодировки символов из 16 системы счисления в ASCII или BCD код
.model small
.486
.stack 100h
.data
SH db 0h,1h,2h,3h,4h,5h,6h,7h,8h,9h,0ah,0bh,0ch,0dh,0eh,0fh
ASCII db '0123456789abcdef'
BCD db 0,1,2,3,4,5,6,7,8,9,10h,11h,12h,13h,14h,15h
.code
begin: mov ax,@data
mov ds,ax
mov al,SH[3]; загрузка 3 элемента массива в al
mov dl,al; пересылка его в dl
lea bx,ASCII; настройка адреса массива ASCII кодов на регистр bx
xlat ; перекодировка: в al вместо 16 кода ASCII -код
mov ch,al; сохранение его в ch
mov al,dl; восстановление 16 кода в al
lea bx,BCD; настройка регистра bx на адрес массива BCD
xlat ; перекодировка: в al вместо 16 кода BCD -код
mov cl,al; сохранение его в cl
mov ah,4ch; завершение программы
int 21h
end begin
;****************************************************************
;Программа ввода и перевода вещественных границ интервала определения функции
.Model Small
.486
.Stack 200h
.Data
buf db 18; буфер для ввода вещественного числа
db 0; MS DOS возвращает число введенных символов
db 18 dup(0) ; максимальный размер вводимой строки
ten dw 10; константа 10
XL dq 0 ; левая граница интервала
XP dq 0 ; правая граница интервала
mes1 db 13,10,' Введите левую границу' ,13,10,'$'
mes2 db 13,10,' Введите правую границу' ,13,10,'$'
mes3 db 13,10,' Левая граница не может быть равна правой!',13,10,'$'
mes4 db 13,10,' Левая граница не может быть больше правой!',13,10,'$'
c dw 0; переменная для двоичного кода одной цифры числа
;*********************************************************
.Code
GRAN PROC; Процедура ввода и перевода вещественного числа
pusha
vvod:
mov ah, 0Ah; вызов системной функции для ввода строки
lea dx, buf
int 21h
fldz; загрузка в стек сопроцессора 0
mov si, 2; настройка si на первый символ введенной строки в буфере
cmp buf[si],'-'; первый символ - минус?
je M1; да переход на M1
cmp buf[si],'+'; первый символ плюс?
jne M2; если нет то переход на M2
M1: inc si; переход к следующему символу в строке
M2: cmp buf[si],'.'; очередной символ десятичная точка
je Drob; если да то переход на обработку дробной части
cmp buf[si],0dh ; иначе сравнение с кодом клавиши Enter признак конца строки
je Kon_enter; если да то переход на метку Kon_enter
cmp buf[si],'0'; иначе проверка: символ это цифра?
jb vvod; если код символа меньше кода нуля то повторный ввод
cmp buf[si],'9';
ja vvod; если код символа больше кода девяти то повторный ввод
mov al,buf[si]; если цифра то загрузить ее код в al
sub al,'0'; перевод кода символа цифры в двоичный код
xor ah,ah; обнуление регистра
mov c, ax; сохранение двоичного кода цифры
fimul ten; умножение числа в вершине стека на 10
fild c; загрузка кода цифры в вершину стека
fadd; сложение с предыдущей частью числа
inc si
jmp M2; переход к следующему символу в целой части числа
Drob:; обработка дробной части
fldz
xor bx,bx
mov bl,buf[1]; загрузка в bx числа введенных символов
mov si,bx; настройка si на последний символ
inc si
L1:; цикл обработки дробной части
mov al,buf[si]
cmp al,'.'; сравнение с кодом десятичной точки
je Kon_drob; если точка то завершение обработки дробной части
cmp buf[si],'0'; проверка кода символа на цифры
jb vvod
cmp buf[si],'9'
ja vvod
sub al,'0'; перевод в двоичный код
xor ah,ah
mov c, ax; сохранение двоичного кода цифры
fild c; загрузка кода цифры в вершину стека
fadd; сложение с предыдущей дробной частью числа
fidiv ten; деление на 10
dec si
jmp L1; переход к следующей цифре
Kon_drob: fadd; сложение целой и дробной частей числа
Kon_enter:
cmp buf[2],'-'; определение отрицательного числа
jne Kon; если число положительное то на метку Kon
fchs; иначе инвертировать число в вершине стека
Kon:
popa
ret
GRAN endp
;*******************************************
Start:; начало основной программы
mov ax,@data
mov ds,ax
repeat:
finit; инициализация сопроцессора
mov ah,9; вывод первого сообщения
lea dx,mes1
int 21h
Call GRAN
fst XL; сохранение левой границы интервала
mov ah,9; вывод второго сообщения
lea dx,mes2
int 21h
Call GRAN
fst XP; сохранение правой границы интервала
fcom; сравнение левой и правой границ
fstsw ax; передача кодов условия в ЦП
fwait
sahf
je ravno; если границы равны то ошибка
jb menshe; если правая граница меньше левой то ошибка
jmp end_progr; если границы введены верно то выход из программы
ravno:
mov ah,9
lea dx,mes3
int 21h
jmp repeat
menshe:
mov ah,9
lea dx,mes4
int 21h
jmp repeat
end_progr:
mov ah,4ch
int 21h
End Start