- •Содержание
- •1.Введение в архитектуру эвм. 5
- •2.Архитектура реального режима работы м/п семейства 8086 19
- •3.Директивы и операторы ассемблера 81
- •4.Архитектура и система команд арифметического сопроцессора 91
- •5.Варианты контрольных работ 131
- •6.Примеры программ 138
- •1.Введение в архитектуру эвм.
- •2.Архитектура реального режима работы м/п семейства 8086
- •2.1.Форматы данных микропроцессора
- •2.1.1.Числа
- •2.1.2.Символы
- •2.1.3.Указатели
- •2.1.4.Цепочки
- •2.2.Адресация памяти
- •2.3.Внутренние регистры процессора
- •2.3.1.Регистры общего назначения
- •2.3.2.Сегментные регистры
- •2.3.3.Регистры смещения
- •2.3.4.Регистр флагов
- •2.4.Режимы адресации
- •2.4.5.Базовая адресация
- •2.5.1.1. Общие команды.
- •2.5.1.2. Команды push и pop .
- •2.5.1.3. Команды ввода-вывода.
- •2.5.1.4. Адресные команды (пересылки адреса)
- •2.5.1.5. Флажковые команды (команды пересылки флагов).
- •2.5.2.Арифметические команды.
- •2.5.2.1. Команды сложения.
- •2.5.2.2.Команды вычитания.
- •2.5.2.3.Команды умножения и деления.
- •2.5.2.4.Команды расширения знака.
- •2.5.2.5.Десятичная арифметика.
- •2.5.3.Логические команды.
- •2.5.3.1.Булевы команды.
- •2.5.3.2.Команды сдвигов.
- •2.5.3.3.Команды циклических сдвигов.
- •2.5.3.4.Команды двойного сдвига
- •2.5.3.5.Команды работы с двоичными цепочками
- •2.5.4.Команды передачи управления.
- •2.5.4.1.Команды безусловной передачи управления.
- •2.5.4.2. Команды условных переходов.
- •2.5.4.3.Команды SetCondition
- •2.5.5.Цепочечные (строковые) команды.
- •2.5.5.1.Команды пересылки цепочки.
- •2.5.5.2.Команды сравнения цепочек.
- •2.5.5.3.Команды сканирования цепочек.
- •2.5.5.4.Команды загрузки.
- •2.5.5.5.Команды ввода и вывода цепочек.
- •2.5.5.6.Замена сегмента.
- •2.5.6.Команды управления микропроцессором.
- •2.5.6.1.Команды управления флагами.
- •2.5.6.2.Команды синхронизации.
- •2.5.6.3.Команда холостого хода.
- •2.5.6.4.Команды прерываний.
- •2.5.7.Новые команды микропроцессора 80486
- •3.Директивы и операторы ассемблера
- •3.1.Структура программы
- •3.2.Организация программы.
- •3.2.1. Модели памяти
- •3.2.2. Процедуры
- •3.2.3. Директивы задания набора допустимых команд
- •3.3.Примеры использования директив в программах типа .Exe и .Com.
- •4.Архитектура и система команд арифметического сопроцессора
- •4.1.Форматы чисел сопроцессора
- •4.1.1.`Целые числа
- •4.1.2. Вещественные числа
- •4.1.3.Диапазоны вещественных чисел в х87.
- •4.2.Особые случаи вещественной арифметики
- •4.3.Формирование специальных значений в особых случаях
- •4.3.1. Случай неточного результата.
- •4.3.2.Численное антипереполнение.
- •4.3.3. Денормализованный операнд.
- •4.3.4. Деление на ноль.
- •4.3.5.Численное переполнение.
- •4.3.6.Недействительная операция.
- •4.4.Регистры математического сопроцессора.
- •4.4.1.Численные регистры (регистровый стек).
- •4.4.2.Регистр управления (cw)
- •4.4.3.Регистр состояния.
- •4.4.4. Регистр тэгов (признаков).
- •4.4.5.Указатели особого случая.
- •4.5.Система команд арифметического сопроцессора.
- •4.5.1.Команды передачи данных.
- •4.5.2.Арифметические команды
- •4.5.3.Дополнительные арифметические команды
- •4.5.4.Команды сравнений
- •4.5.5.Трансцендентные команды
- •4.5.6.Административные команды
- •4.6.Совместная работа двух процессоров в системе.
- •4.6.1.Синхронизация по командам.
- •4.6.2.Синхронизация по данным.
- •5.Варианты контрольных работ
- •5.1.Контрольная работа №1
- •5.2. Контрольная работа №2
- •6.Примеры программ
- •Список рекомендуемой литературы
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 после возврата из процедуры, так как при многократных вызовах процедуры это надо будет делать каждый раз.