
- •Конспект лекций по ассемблеру
- •Структурная схема эвм
- •Организация памяти
- •Порты ввода/вывода
- •Сегментация памяти
- •Логические и физические адреса памяти
- •Адресация команд
- •Адресация данных
- •Адресация сегмента стека
- •Перемещаемые программы
- •Структура микропроцессора
- •Назначение регистров микропроцессора
- •Регистр флагов
- •Ассемблер
- •Выражения
- •Структура машинного оператора
- •Директивы ассемблера
- •Директивы определения данных
- •Определение слова
- •Команды и способы адресации операндов
- •Режимы адресации
- •Команда сложения add
- •Команда сложения с переносом adc
- •Команда вычитания sub
- •Imul – команда умножения со знаком
- •Idiv – команда деления со знаком
- •Команда сравнения cmp
- •Команды безусловного перехода jmp
- •1. Короткий относительный переход
- •2. Внутрисегментный переход
- •Команды условных переходов
- •Знаковые
- •Беззнаковые
- •Специальные
- •Способы адресации
- •Двухоперандные команды
- •Косвенная адресация
- •Регистровая адресация
- •Прямая адресация с индексированием
- •Прямая адресация с базированием
- •Адресация по сумме d8 и индексный регистр
- •Адресация по сумме базового регистра и смещения
- •Адресация с базированием и индексированием
- •Прямая адресация с базированием и индексированием
- •Двухоперандная команда, в которой второй операнд непосредственный
- •Формат двухоперандных команд с акумулятором и но
- •Форматы команды inc
- •Форматы команд pop и push
- •Однобайтные команды без операндов
- •Команды передачи данных mov
- •Команда обмена xchg
- •Команда загрузки исполнительного адреса lea
- •Команды управления циклами команда цикла loop
- •Команды переходов loopz, loope
- •Команды вызова подпрограмм call
- •Структура подпрограммы
- •Команды возврата
- •Передача параметров в процедуру
- •Примеры на обработку матрицы
- •Функции ввода/вывода
- •Функция вызова команды int 21h
- •Вывод на экран дисплея
- •Ввод с клавиатуры
- •Процедура ввода числа форматом слово
2. Внутрисегментный переход
Если адресное расстояние между командой JMP METКА и меткой выходит за диапазон байта со знаком , то компилятор ассемблера формирует команду внутрисегментного перехода.
┌───────┐ ┌───────┐
│ KOП │ │ disp16│
└───────┘ └───────┘
Предположим, что адрес М2 равен 439Fh, а команда расположена по адресу 0023h.
Вычислим disp16.
1)P = IP +3=0323+3 =0326; длина команды 3 байта
2)адрес М2 439Fh
адрес команды -0326h
--------------------
disp16 = 4079h
Рассмотрим алгоритм выполнения команды:
JMP M2
1)P = IP +3=0323+3 =0326; длина команды 3 байта
2)
IP = 0326h +
Disp=4079h
-----
439Fh = IP
Результат заносится в регистр IP – адрес метки M2.
Транслятор самостоятельно вычисляет смешение метки относительно следующей команды и в зависимости от значения формирует короткий или внутрисегментный переход. Записи команд короткого и внутрисегментного переходов одинаковые JMP M2. Для явного указания типа переходов используются указатели:
JMP near M2; внутрисегментный переход;
JMP short M2; короткий переход.
Команды условных переходов
Используют только короткий переход (-128..127)
При выходе за диапазон выдается синтаксическая ошибка.
Аналог в Паскале:
if a=0 then goto met
1) CMP A,0 ; синтаксическая ошибка
JZ MET ; если адресное расстояние >127
2) иначе
CMP A,0
JNZ M1
JMP MET
M1: продолжение программы.
Команды условных переходов делятся на:
- знаковые
- беззнаковые
- спец. назначения
Знаковые
┌─────────┬─────────────┬─────────────────────────────────────┐
│Переход │Флаги │ Примечания │
├─────────┼─────────────┼─────────────────────────────────────┤
│JE/JZ │ ZF │Если равно / Если ноль │
├─────────┼─────────────┼─────────────────────────────────────┤
│JNE/JNZ │ ┐ZF │Если не равно / Если не ноль │
├─────────┼─────────────┼─────────────────────────────────────┤
│JG/JNLE │┐ZF&(SF=OF) │Если > / Если не < и не равно │
├─────────┼─────────────┼─────────────────────────────────────┤
│JGE/JNL │ SF=OF │Если >= / Если не < │
├─────────┼─────────────┼─────────────────────────────────────┤
│JL/JNGE │ (SF<>OF) │Если < / Если не > и не равно │
├─────────┼─────────────┼─────────────────────────────────────┤
│JLE/JNG │ZF V (SF<>OF)│Если =< / Если не > │
└─────────┴─────────────┴─────────────────────────────────────┘
Беззнаковые
┌─────────┬────────────┬──────────────────────────────────────┐
│Переход │Флаги │ Примечания │
├─────────┼────────────┼──────────────────────────────────────┤
│JE/JZ │ ZF │Если равно / Если ноль │
├─────────┼────────────┼──────────────────────────────────────┤
│JNE/JNZ │ ┐ZF │Если не равно / Если не ноль │
├─────────┼────────────┼──────────────────────────────────────┤
│JA/JNBE │ ┐ZF & ┐CF │Если выше / Если не ниже и не равно │
├─────────┼────────────┼──────────────────────────────────────┤
│JAE/JNB │ ┐CF │Если выше или равно / Если не ниже │
├─────────┼────────────┼──────────────────────────────────────┤
│JB/JNAE │ CF │Если ниже / Если не выше и не равно │
├─────────┼────────────┼──────────────────────────────────────┤
│JBE/JNA │ CF V ZF │Если ниже или равно / Если не выше │
└─────────┴────────────┴──────────────────────────────────────┘