- •Программирование на языке Ассемблер
- •Классификация языков программирования
- •Поколения мп
- •Структура мп 8086
- •Регистры мп
- •Регистры общего назначения
- •Сегментные регистры
- •Регистры смещений
- •Регистр флагов
- •Структура и организация памяти
- •Сегментация памяти и формирование адреса
- •Особенности машинных команд
- •Основные команды мп
- •1.2 Перестановка (exchange):
- •1.3 Загрузка исполнительного адреса (load effective address):
- •3.1 Команды умножения
- •3.2 Команды деления
- •Переходы. Циклы
- •Команды сравнения и условного перехода
- •Команды условного перехода
- •3. Команды управления циклом
- •Язык Ассемблера ibm pc. Структура операторов и директив. Метки, переменные и их атрибуты
- •Команды
- •Директивы
- •Директивы определения данных
- •Конструкция повторения dup
- •Директива dd (define double word, определить двойное слово)
- •Директивы эквивалентности и присваивания
- •Структура программы. Логические сегменты
- •Побитовая обработка и ее основные виды
- •2. Команды сдвига
- •2.1. Логические сдвиги
- •2.2. Арифметические сдвиги
- •2.3. Циклические сдвиги
- •Стек и сегмент стека
- •Стековые команды
- •Пример использования стека
- •Модульное программирование
- •Типы объединения модулей
- •Связь Паскаль-Ассемблер
- •Параметры-значения
- •Параметры-переменные
- •Способы адресации
- •Команды строковых примитивов
- •Сканирование строки: scasb, scasw
- •Приемы обработки структурированной информации
- •Inc si ; к следующей оценке
- •Inc dx ; учет отличника
- •Составление и оформление программ на ассемблере
- •Префикс программного сегмента. Com- и exe-программы
- •Команда прерывания
- •Функции прерывания 21h
- •Процесс разработки программы на языке ассемблера
- •Трансляция программы
- •Компоновка программы
- •Макроповторения
- •Макрооператоры
- •Директива local
- •Директивы условного ассемблирования
- •Директивы if и ife
- •Директивы ifidn и ifdif
Команды сравнения и условного перехода
Сравнение (compare):
CMP op1,op2
SUB op1,op2
Команды условного перехода
Jxx <метка>
Все команды условного перехода разделяют на три группы.
В первую группу входят команды, которые следуют после команды сравнения. В их мнемокодах с помощью определенных букв описывается то исход сравнения, при котором надо делать переход.
E – equal (равно)
N – not (не, отрицание)
G – greater (больше) – для чисел со знаком
L – less (меньше) – для чисел со знаком
A – above (выше, больше) – для чисел без знака
B – below (ниже, меньше) – для чисел без знака
Мнемокод |
Содержательное условие для перехода после CMP op1,op2 |
Состояние флагов для перехода |
для любых чисел: | ||
JE |
op1=op2 |
ZF=1 |
JNE |
op1<>op2 |
ZF=0 |
для чисел со знаком: | ||
JL/JNGE |
op1<op2 |
SF<>OF |
JLE/JNG |
op1<=op2 |
SF<>OF или ZF=1 |
JG/JNLE |
op1>op2 |
SF=OF и ZF=0 |
JGE/JNL |
op1>=op2 |
SF=OF |
для чисел без знака: | ||
JB/JNAE |
op1<op2 |
CF=1 |
JBE/JNA |
op1<=op2 |
CF=1 или ZF=1 |
JA/JNBE |
op1>op2 |
CF=0 и ZF=0 |
JAE/JNB |
op1>=op2 |
CF=0 |
Пример: записать в Z максимальное из чисел X и Y.
MOV AX,X
CMP AX,Y ; X=Y?
JGE M ; X>=Y ->M
MOV AX,Y
M: MOV Z,AX
Во вторую группу команд условного перехода входят те, которые следуют после команд, отличных от команды сравнения, и которые реагируют на то или иное значение какого-нибудь определенного флага. В мнемокодах этих команд указывается первая буква проверяемого флага, если переход должен быть выполнен при значении 1 у флага, либо эта буква указывается с буквой N (not), если переход надо сделать при нулевом значении флага.
Мнемокод |
Условие перехода |
Мнемокод |
Условие перехода |
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 |
Пример: требуется вычислить C=A*A+B, но если ответ превосходит размер байта, тогда надо передать управление на метку ERROR.
MOV AL,A
MUL AL
JC ERROR
ADD AL,B
JC ERROR
MOV C,AL
В третью группу входит только одна команда условного перехода, проверяющая значение регистра CX:
JCXZ <метка>
Действие команды JCXZ можно описать так:
if cx=0 then goto < метка >.
3. Команды управления циклом
MOV CX, N ; CX – счетчик цикла (число повторений)
L: … ;
… ; тело цикла
… ;
DEC CX ; CX:= CX-1
CMP CX, 0 ; CX=0?
JNE L ; CX<>0 -> goto L
Управление циклом по счетчику:
LOOP <метка>
С помощью данной команды цикл запишется следующим образом:
MOV CX, N ;
L: … ;
… ; тело цикла
… ;
LOOP L
Цикл по счетчику и пока равно (пока ноль):
LOOPE <метка> или
LOOPZ <метка>
Условие повторения: (CX<>0) и (ZF=1).
Условие выхода: (CX=0) или (ZF=0).
Цикл по счетчику и пока не равно (пока не ноль):
LOOPNE <метка> или
LOOPNZ <метка>
Условие повторения: (CX<>0) и (ZF=0).
Условие выхода: (CX=0) или (ZF=1).