
- •Содержание
- •Введение
- •Архитектура микропроцессоров Intel 8086
- •Общие принципы работы мп 8086 при выполнении прикладных программ
- •Регистры
- •Адресация
- •Непосредственная адресация
- •Прямая адресация
- •Регистровая адресация
- •Косвенная регистровая адресация
- •Адресация no базе
- •Индексная адресация
- •Индексная адресация со смещением
- •Система команд
- •Команды пересылки данных
- •Арифметические команды
- •Битовые команды
- •Строковые команды
- •Команды передачи управления
- •Команды перехода
- •Условные
- •Безусловные
- •Команды условного перехода
- •Команды управления циклом
- •Тело цикла
- •Команды прерываний
- •Структура программы на языке ассемблера
- •Основные понятия языка ассемблера
- •Написание сегмента данных
- •Написание сегмента стека
- •Написание сегмента кода
- •Написание головной подпрограммы
- •Подготовка программ к выполнению
- •Отладка программ в Turbo Debugger
- •Специфика встроенного ассемблера
- •Оператор asm
- •Синтаксис ассемблерных команд
- •Коды инструкций
- •Операнды
- •Константы
- •Выражения
- •Операции
- •Бинарная операция -
- •Побитовые операции not, and, or, xor
- •Директивы ассемблера
Прямой переход Косвенный переход
Jmp <метка> Jmp r (или m)
Адрес команды, на которую делается переход r, m содержат «настоящий» адрес перехода
относительный (т.е. отсчитывается от команды перехода)
??? Jmp Z ???
Прямой переход по метке Z? Косвенный переход по адресу из ячейки Z?
Если Z описана до команды перехода, все ясно, если нет — Ассемблер считает, что Z – метка
Jmp Z Jmp Z Jmp Word PTR Z
- - - - - - - - - - - -
Z: Z DW L Z DW L
Условный переход = 1. Сравнение установка соотв. Флагов
2. Переход (короткий 30 –40 команд)
-
Команда сравнения
Cmp op1, op2
Аналог команды Sub, устанавливает флаги: ZF (ноль), SF(знак), CF(перенос), OF(переполнение)
-
Команды условного перехода
Можно разделить на 3 группы:

А) Стоят после команды Cmp
Мнемокод |
Условие |
Флаги |
|
||
JE |
op1=op2 |
ZF=1 |
JNE |
op1<>op2 |
ZF=0 |
Для чисел со знаком |
||
JL |
op1<op2 |
SF<>OF |
JLE |
op1<=op2 |
SF<>OF или ZF=1 |
JG |
op1>op2 |
SF=OF и ZF=1 |
JGE |
op1>=op2 |
SF=OF |
|
||
JB |
op1<op2 |
CF=1 |
JBE |
op1<=op2 |
CF=1 или ZF=1 |
JA |
op1>op2 |
CF=0 и ZF=0 |
JAE |
op1>=op2 |
CF=0 |
Б) Стоят после команд, отличных от Cmp
Мнемокод |
Условие |
Мнемокод |
Условие |
JZ |
ZF=1 |
JNZ |
ZF=0 |
JS |
SF=1 |
JNS |
SF=0 |
JC |
CF=1 |
JNC |
CF=0 |
JO |
OF=1 |
JNO |
OF=0 |
JP |
PF=1 |
JNP |
PF=0 |
В) Проверка регистра СХ
JCXZ <метка>
If CX=0 then goto <метка>
Команды управления циклом
-
С помощью команд перехода можно реализовать любые разветвления и циклы:
А) If x>0 then S1 else S2
CMP X,0
JLE L2
JMP FIN
L2:
FIN:
B) While x>0 do S
BEG: CMP X,0
JLE FIN
JMP BEG
FIN:
C) Repeat S until x>0
BEG:
CMP X,0
JG BEG
S
S1
S
S2
-
Для организации цикла с заранее известным числом повторений можно использовать
команду LOOP, действие которой можно описать так:
1. В качестве счетчика — только регистр СХ;
2. Начальное значение СХ задавать до цикла;
3. Реализуется только короткий (30-40) переход;
4. При возможном СХ=0 надо выполнить обход цикла:
CX:=CX – 1; If CX<>0 Then goto <метка>
MOV CX, N
JCXZ L1
L:
LOOP L
L1:
Тело цикла
Пример Вычислить N! (N – байтовая, <=8) и результат записать в АХ. При N=0 цикл не должен выполняться.
Параметр цикла I можно менять и в обратном направлении, а т.к. именно так и меняется СХ, то его можно использовать не только как счетчик, но и как параметр:
MOV AX, 1
MOV CL, N
MOV CH, 0
JCXZ F1
MOV SI, 1
F: MUL CX
LOOP F
F1:
MOV AX, 1
MOV CL, N
MOV CH, 0
JCXZ F1
MOV SI, 1
F: MUL SI
INC SI
LOOP F
F1:
-
Для организации цикла с известным числом повторений, из которого возможен досрочный выход, используются команды:
LOOPE / LOOPZ
CX:=CX –1; if (CX<>0) and (ZF=1) then goto <метка>
Используется для поиска 1-го элемента последовательности, отличного от заданной величины
LOOPNE / LOOPNZ
CX:=CX –1; if (CX<>0) and (ZF=0) then goto <метка>
Используется для поиска элемента последовательности, имеющего заданную величину
Пример Записать в BL наименьшее число из [2, К], на которое не делится число N (K, N – байтовые переменные, 2<=K<N) или записать 0, если такого числа нет.
MOV DL, N
MOV DH, 0
MOV CL, K
MOV CH, 0
DEC CX
MOV BL, 1
DV: INC BL
MOV AX, DX
DIV BL
CMP AH, 0
LOOPE DV
JNE DV1
MOV BL, 0
DV1: