- •Введение.
- •Лекция 1. Архитектура эвм Понятие архитектуры эвм.
- •Архитектура фон Неймана.
- •Лекция 2. Микропроцессор. Характеристики микропроцессора. Структура универсального микропроцессора.
- •Характеристики процессора
- •Лекция 3. Организация памяти. Модели памяти.
- •Режимы работы микропроцессора
- •Лекция 4. Модели памяти.
- •Сегментированная модель памяти.
- •Формирование линейного адреса в реальном режиме.
- •Формирование линейного адреса в защищенном режиме
- •Страничная модель памяти
- •Лекция 5. Типы данных. Форматы команд. Форматы и типы данных
- •Формат машинной команды
- •Лекция 6. Архитектура мп 8086. Программная модель микропроцессора.
- •Лекция 7. Архитектура 32-разрядного универсального микропроцессора ia32
- •Лекция 8. Методы адресации
- •Лекция 9. Структура машинной команды.
- •Лекция 10. Структура программы на ассемблере.
- •Лекция 11. Система команд микропроцессора 8086. Команды пересылки данных
- •Команды пересылки данных
- •Команды преобразования типов
- •Команды преобразования данных.
- •Xlat [адрес_таблицы_перекодировки]
- •Лекция 12. Целочисленные арифметические команды двоичной арифметики
- •Команда сравнения как команда с арифметическим принципом действия
- •Лекция 13. Команды манипулирования битами
- •Логические команды
- •Команды сдвига
- •Коп операнд, счетчик_сдвигов
- •Команды линейного сдвига
- •Команды циклического сдвига
- •Дополнительные команды сдвига
- •Лекция 14. Команды передачи управления
- •Команда безусловного перехода
- •Команды условного перехода
- •Организация циклов
- •Лекция 15. Стек
- •Работа стека
- •Управление стеком
- •Доступ к элементам стека
- •Лекция 16. Модульное программирование. Процедуры Концепция модульного программирования
- •Понятие "процедура"
- •Описание процедуры
- •Команда вызова процедуры. Команда возврата управления
- •Организация интерфейса с процедурой
- •Возврат результата из процедуры
- •Лекция 18. Цепочки
- •Синтаксис цепочечных команд
- •Префиксы повторения
- •Цепочечные индексные регистры
- •Направление обработки цепочки
- •Пересылка цепочек
- •Сравнение цепочек
- •Поиск в цепочках
- •Загрузка цепочек
- •Запись данных в цепочку. Заполнение памяти
- •Лекция 19. Массивы
- •Описание и инициализация массива в программе
- •Доступ к элементам массива
- •Двухмерные массивы
- •Лекция 20. Структуры
- •Описание шаблона структуры
- •Определение данных с типом структуры
- •Ссылки на поля структур
- •Использование структурированных переменных
- •Лекция 21. Расширенные возможности современных микропроцессоров Архитектурные особенности
- •Дополнительные режимы адресации
- •Использование средств 32-разрядных процессоров в программировании
- •Лабораторный практикум Лабораторная работа №1. Этапы создания программы на ассемблере. Отладчик Turbo Debugger
- •Лабораторная работа №2. Команды пересылки данных. Арифметические команды
- •Задачи для самостоятельного решения
- •Лабораторная работа №3 . Команды для работы с битами.
- •Демонстрационные примеры
- •Задачи для самостоятельного решения
- •Лабораторная работа №4. Команды передачи управления
- •Лабораторная работа №5. Прерывания.
- •Демонстрационные примеры
- •Задачи для самостоятельного решения
- •Лабораторная работа №6. Модульное программирование. Подпрограммы
- •Задачи для самостоятельного решения
- •Лабораторная работа №7. Стек.
- •Лабораторная работа №8 . Массивы
- •Задачи для самостоятельного решения
- •Лабораторная работа №9. Цепочки
- •Демонстрационные примеры.
- •Задачи для самостоятельного решения
- •Лабораторная работа №10. Структуры
- •Демонстрационные примеры.
- •Лабораторная работа №11. Файлы
- •Демонстрационные примеры
- •Задачи для самостоятельного решения
- •Литература
Команды условного перехода
Данные команды позволяют процессору "принять решение" о ходе выполнения программы в зависимости от определённых условий.
Jx <Метка перехода>
х - модификатор, состоящий из одной, двух или трёх букв.
Мнемонический код этой команды всегда начинаются с буквы J от первой буквы английского слова Jump ("перейти"). Остальные буквы могут быть следующими (они определяются в зависимости от условия):
Буква мнемокода |
Условие |
Тип операндов |
Е |
равно |
любые |
N |
не равно |
любые |
G |
больше |
числа со знаком |
L |
меньше |
числа со знаком |
А |
выше, в смысле “больше” |
числа без знака |
В |
ниже, в смысле “меньше” |
числа без знака |
Что касается операнда <Метка перехода>, то эта метка может находиться только в пределах текущего сегмента кода; межсегментной передачи управления в условных переходах не допускается. В связи с этим отпадает вопрос о модификаторе, который присутствовал в синтаксисе команд безусловного перехода. В ранних моделях микропроцессора (i8086, i80286) команды условного перехода могли осуществлять только короткие переходы - на расстояние от -128 до +127 байтов от команды условного перехода. Начиная с модели i80386, это ограничение снято, но только в пределах текущего сегмента кода.
Для того чтобы принять решение о том, куда будет передано управление командой условного перехода, предварительно должно быть сформировано условие, на основании которого и будет приниматься решение о передаче управления. Источниками такого условия могут быть:
- команда сравнения CMP, сравнивающая значения двух операндов;
- любая команда, изменяющая состояние арифметических флагов;
- состояние регистра ECX/CX.
Формат команды CMP:
CMP операнд1, операнд2
Эта команда осуществляет, по сути, вычитание операнд1 - операнд2, однако результат никуда не записывает, а только устанавливает флаги в соответствие с нижеприведенной таблицей.
Сравниваемые операнды |
Флаги |
|||
|
OF |
SF |
ZF |
CF |
Операнды без знака Источник < приемник |
- |
- |
0 |
1 |
Источник = приемник |
- |
- |
1 |
0 |
Источник > приемник |
- |
- |
0 |
0 |
Операнды со знаком |
|
|
|
|
Источник < приемник |
0/1 |
1 |
0 |
- |
Источник = приемник |
0 |
0 |
1 |
- |
Источник > приемник |
0/1 |
0 |
0 |
- |
Приведем еще одну таблицу, в которой отражается действие команд условного перехода по значениям анализируемых этими командами флагов:
Мнемокод команды |
Критерий перехода |
Значения флагов для перехода |
Тип операндов: любые числа |
||
JE |
Операнд_1=операнд_2 |
ZF=1 |
JNE |
Операнд_1<>операнд_2 |
ZF=0 |
Тип операндов: числа со знаком |
||
JL/JNGE |
Операнд_1<операнд_2 |
SF<>OF |
JLE/JNG |
Операнд_1<=операнд_2 |
SF<>OF или ZF=1 |
JG/JNLE |
Операнд_1>операнд_2 |
SF=OF и ZF=0 |
JGE/JNL |
Операнд_1>=операнд_2 |
SF=OF |
Тип операндов: числа без знака |
||
JB/JNAE |
Операнд_1<операнд_2 |
CF=1 |
JBE/JNA |
Операнд_1<=операнд_2 |
CF=1 или ZF=1 |
JA/JNBE |
Операнд_1>операнд_2 |
CF=0 и ZF=0 |
JAE/JNB |
Операнд_1=>операнд_2 |
CF=0 |
Команды условного перехода без использования команды сравнения
мнемокод |
Описание |
Проверяемые флаги |
JC |
Перейти при переносе (аналогично JB) |
CF=1 |
JNC |
Перейти при отсутствии переноса |
CF=0 |
JO |
Перейти при переполнении |
OF=1 |
JNO |
Перейти при отсутствии переполнения |
OF=0 |
JP/JPE |
Перейти при четности |
PF=1 |
JNP/JPO |
Перейти при нечетности |
PF=0 |
JS |
Перейти при наличии отрицательного знака |
SF=1 |
JNS |
Перейти при отсутствии отрицательного знака |
SF=0 |
Команды, условием перехода которой является состояние регистра CX
JCXZ |
Перейти, если содержимое CX - 0 |
CX=0 |
Важно отметить ограничения, свойственное команде JCXZ: в отличие от других команд условной передачи управления, эта команда может адресовать только короткие переходы - на -128 байтов или на +127 байтов от следующей за ней командой.
Если при программировании условия Вы воспользовались арифметической командой, то после неё уже не надо применять команду сравнения, поскольку дальнейшее сравнение результата будет осуществляться с 0 (если, конечно, Вы не будете сравнивать результат с другим операндом).
Рассмотрим некоторые арифметические команды, которые могут быть использованы в качестве условия: ADD, ADC, SUB, SBB, MUL, IMUL. Все эти команды вычитают операнд-источник из операнда-приёмника и в зависимости от результата устанавливают или обнуляют флаги.
Укажем значения флагов после выполнения ADD, ADC, SUB и SBB:
CF=1, если результат не помещается в операнде-приёмнике;
PF=1, если результат имеет чётное число битов;
ZF=1, если результат равен 0;
SF=1, если результат отрицателен;
OF=1, если результат превышает диапазон допустимых значений приёмника в обратном коде.
Отметим, что содержимое SF и OF имеют смысл только при сложении и вычитании чисел со знаком.
