- •Основы алгоритмизации и программирования
- •29 Декабря 2011, протокол № 4
- •Введение
- •Этапы развития эвм
- •Поколения эвм
- •Машинно-ориентированные языки программирования
- •Архитектура эвм
- •Микропроцессоры intel
- •Набор регистров
- •Регистры общего назначения
- •Сегментные регистры
- •Регистры состояния и управления
- •Организация памяти
- •Сегментная организация памяти
- •Типы данных
- •Символы
- •Целые числа
- •Указатель на память
- •Цепочки
- •Вещественые числа
- •Двоично-десятичные числа (bcd)
- •Формат команд
- •Обработка прерываний
- •Int тип_прерывания
- •Синтаксис ассемблера
- •Алфавит ассемблера
- •Директивы сегментации
- •Упрощённые директивы сегментации
- •Директивы резервирования и инициализации данных
- •Операнды
- •Способы задания операндов Прямая адресация
- •Косвенная адресация
- •Косвенная базовая адресация
- •Косвенная базовая адресация со смещением
- •Косвенная индексная адресация со смещением
- •Косвенная базовая индексная адресация
- •Косвенная базовая индексная адресация со смещением
- •Операторы
- •Функциональная классификация машинных команд
- •Команды пересылки данных Команды общего назначения
- •Работа с адресами и указателями
- •Преобразование данных
- •Xlat [адрес_таблицы_перекодировки]
- •Ввод из порта и вывод в порт
- •Работа со стеком
- •Арифметические команды Форматы арифметических данных
- •Арифметические операции над целыми двоичными числами
- •Логические команды
- •Команды передачи управления
- •Команда безусловного перехода
- •Условные переходы
- •Организация циклов
- •Основы алгоритмизации и программирования
Команды передачи управления
Программы, в которых все команды выполняются последовательно одна за другой (линейно), встречаются очень редко. Обычно в программах есть точки, в которых нужно принять решение о том, какая команда будет выполняться следующей. Это решение может быть:
безусловным – когда необходимо передать управление не следующей команде, а другой, находящейся на некотором удалении от текущей;
условным – решение о том, какая команда будет выполняться следующей, принимается на основе анализа некоторых условий.
То, какая команда будет выполняться следующей, процессор узнаёт по содержимому регистров CS:IP. Таким образом, команды передачи управления изменяют содержимое регистров CS и IP.
Место, куда необходимо передать управление обозначается при помощи меток. Метка – это символическое имя, обозначающее определённую ячейку памяти и предназначенное для использования в качестве операнда в командах передачи управления.
Как и переменной, метке транслятор присваивает три атрибута:
имя сегмента кода, где метка описана;
смещение (в байтах) от начала сегмента;
тип (атрибут расстояния), который может принимать два значения:
near – переход на метку возможен только в пределах сегмента кода, в котором она описана, то есть достаточно изменить IP;
far – переход на метку возможен в результате межсегментной передачи управления, врезультате изменяется содержимое CS и IP.
Метку можно определить двумя способами:
оператором : (двоеточие) – только метку ближнего типа near;
директивой LABEL – тип метки при этом может быть как near так и far.
Например:
M1:
mov ax, pole
или
M1 label near
mov ax, pole
Команда безусловного перехода
Синтаксис команды безусловного перехода без сохранения информации о точке возврата:
JMP [модификатор] адрес_перехода
Здесь адрес_перехода представляет метку или адрес области памяти, в которой находится указатель перехода.
Условные переходы
Процессор поддерживает 18 команд условного перехода, позволяющих проверить:
отношение между операндами со знаком (больше или меньше);
отношение между операндами без знака (выше или ниже);
состояниями арифметических флагов ZF, SF, CF, OF, PF (но не AF).
Команды условного перехода имеют одинаковый синтаксис:
JCC метка_перехода
Вместо символов «сс» указывается конкретное условие, анализируемое командой. Что касается операнда метка_перехода, то он определяет метку перехода, которая может находиться только в пределах текущего сегмента кода.
Таблица 10. – Значение аббревиатур в названии команды JCC
Мнемоническое обозначение |
Термин |
Перевод |
Тип операндов |
E |
Egual |
Равно |
Любые |
N |
Not |
Нет |
Любые |
G |
Greater |
Больше |
Числа со знаком |
L |
Less |
Меньше |
Числа со знаком |
A |
Above |
Выше |
Числа без знака |
B |
Below |
Ниже |
Числа без знака |
Для того чтобы принять решение о том, куда будет передано управление командой условного перехода, предварительно должно быть сформировано условие, на основании которого должно приниматься решение. Источниками такого условия могут быть:
любая команда, изменяющая состояние арифметических флагов;
команда СМР, сравнивающая значения двух операндов;
состояние регистра СХ.
Команда сравнения
Команда сравнения СМР (СоМРаге) имеет интересный принцип работы. Команда СМР так же, как и команда SUB, выполняет вычитание операндов и по результатам сравнения устанавливает флаги. Единственное, чего она не делает, — не записывает результат вычитания на место первого операнда.
Синтаксис команды СМР:
сmр операнд_1,операнд_2
Флаги, устанавливаемые командой СМР, можно анализировать специальными командами условного перехода.
Таблица 11. – Перечень команд условного перехода для команды CMP
Типы операндов |
Команда условного перехода |
Критерий условного перехода |
Значения флагов для перехода |
Любые |
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 |
Так как команды условного перехода не изменяют флагов, то после одной команды СМР вполне могут следовать несколько команд условного перехода. Это может быть сделано для того, например, чтобы исследовать каждую из альтернативных ветвей: больше, меньше или равно:
.data
mas db dup (?)
.code
…
cmp mas[si]. 5 ;сравнить очередной элемент массива с 5
je eql ;переход, если элемент mas равен 5
jl low ;переход, если элемент mas меньше 5
jg grt ;переход, если элемент mas больше 5
eql :
…
low :
…
grt :
…
Команды условного перехода и флаги
Эти команды можно использовать после любых команд, изменяющих указанные флаги.
Таблица 12. Команды условного перехода и флаги
Название флага |
Команда условного перехода |
Значение флага для осуществления перехода |
Переноса |
JC |
CF=1 |
Паритета |
JP |
PF=1 |
Нуля |
JZ |
ZF=1 |
Знака |
JS |
SF=1 |
Переполнения |
JO |
OF=1 |
Переноса |
JNC |
CF=0 |
Паритета |
JNP |
PF=0 |
Нуля |
JNZ |
ZF=0 |
Знака |
JNS |
SF=0 |
Переполнения |
JNO |
OF=0 |
Команды условного перехода и регистр СХ
Регистр СХ имеет определенное функциональное назначение – он выполняет функции счетчика в командах управления циклами и при работе с цепочками символов.
Синтаксис команд JCXZ (Jump if ex is Zero — переход, если СХ ноль)
jcxz метка_перехода
В отличие от других команд условной передачи управления, команда JCXZ может адресовать только короткие переходы — на -128 байт или на +127 байт от следующей за ней команды.
