
Команды передачи управления
Эти команды реализуют изменение естественного порядка выполнения команд программы. Их можно разделить на 3 подгруппы, описание которых сведено в таблицу 4.
Мнемокод |
Формат |
Команды безусловной передачи управления CALL |
CALL имя |
RET |
RET [число удаляемых из стека значений] |
JMP |
JMPимя |
Команды условной передачи управления |
|
JA / JNBE |
JA / JNBE близкая метка |
JAE / JNB |
JAE / JNB близкая метка |
JNC |
JNC близкая метка |
JB / JNAE |
JB / JNAE близкая метка |
JC |
JC близкая метка |
JBE / JNA |
JBE / JNA близкая метка |
JCXZ |
JCXZ близкая метка |
JE / JZ |
JE / JZ близкая метка |
JG / JNLE |
JG / JNLE близкая метка |
JGE / JNL |
JGE / JNL близкая метка |
JL / JGNE |
JL / JGNE близкая метка |
JLE / JNG |
JLE / JNG близкая метка |
JNE / JNZ |
JNE / JNZ близкая метка |
JNO |
JNO близкая метка |
JNP / JPO |
JNP / JPO близкая метка |
JNS |
JNS близкая метка |
JO |
JO близкая метка |
JP / JPE |
JP / JPE близкая метка |
JS |
JS близкая метка |
Команды управления циклами LOOP |
LOOPблизкая метка |
LOOPE / LOOPZ |
LOOPE/LOOPZблизкая метка |
LOOPNE / LOOPNZ |
LOOPNE/LOOPNZблизкая метка |
В приведенной таблице через слеш ‘/’ перечисляются идентичные команды, действие которых совершенно одинаково и применение конкретной из них зависит от пристрастий программиста. Наличие идентичных команд объясняется тем фактом, что если число_1 >число_2, то можно с уверенностью утверждать, что число_1 не (меньше или равно) число_2.
Обратимся теперь к командам условного перехода. В их мнемонические обозначения входят буквы, которые определяют условия в соответствии с нижеприведенной таблицей:
Буква мнемокода |
Условие |
Тип операндов |
Е |
равно |
любые |
N |
Не равно |
любые |
G |
больше |
Числа со знаком |
L |
меньше |
Числа со знаком |
А |
Выше, в смысле “больше” |
Числа без знака |
В |
ниже, в смысле “меньше” |
Числа без знака |
Операнд “метка перехода” или “близкая метка” отражает тот факт, что метка помеченной команды должна находиться в пределах текущего сегмента кода и на относительном расстоянии от команды перехода >-128 и < 127 байтов. Ограничение –128:127 байтов снято у процессоров, начиная с модели 80386, однако ограничение передачи управления в пределах текущего сегментного кода действует и в моделях Пентиум.
Решение о том, куда будет передано управление командой условного перехода, принимается на основании условия. Источниками таких условий могут быть:
любая команда, изменяющая состояние арифметических флагов (ниже эти флаги будут перечислены);
команда сравнения CMP.
В последних публикациях по программированию на Ассемблере среди команд передачи управления рассматривают команду сравнения CMP, хотя эта команда ближе к арифметическим операциям. Объясняется это тем, что, как правило, команды безусловного перехода в программах следуют за командой сравнения, ибо именно сравнение лежит в основе решения (символа процесса).
Формат команды CMP:
CMPприемник, источник или
CMPоперанд1, операнд2
Эта команда осуществляет по сути вычитание операнд_1 - операнд_2 или приемник – источник, однако результат никуда не записывает, а только устанавливает флаги в соответствие с нижеприведенной таблицей.
Сравниваемые операнды |
Флаги | |||
|
OF |
SF |
ZF |
CF |
Операнды без знака Источник < приемник |
Н |
Н |
0 |
0 |
Источник = приемник |
Н |
Н |
1 |
0 |
Источник > приемник |
Н |
Н |
0 |
1 |
Операнды со знаком |
|
|
|
|
Источник < приемник |
0/1 |
0 |
0 |
H |
Источник = приемник |
0 |
0 |
1 |
H |
Источник > приемник |
0/1 |
1 |
0 |
H |
В этой таблице приняты следующие обозначения:
- “H” означает, что ‘не имеет значения” или иначе, на этот флаг операция не влияет;
- 0/1 означает, что флаг устанавливается или в 1 или в 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 |
В приведенной таблице по сути присутствуют 3 группы команд условного перехода, которые названы “любые”, “без знака” и “со знаком”. Беззнаковое число подразумевает, что все его биты – биты данных. Типичные примеры таких чисел – порядковые номера элементов в списке, коды символов, телефонные номера и т.п. Знаковые числа подразумевают, что старший разряд (первый слева) соответствует знаку (значение бита 0 соответствует знаку ‘+’, а значение 1 – знаку ‘-‘.Предположим, CLсодержит 11000110, аDL–00101100. КомандаCMPCL,DLсравнивает содержимое регистров. Если интерпретировать содержимое регистров как беззнаковые числа, то значение вCLбольше, а если в регистрах числа со знаком, тоDLбольше, поскольку как число со знаком значение вCLявляется отрицательным.
Приведу примеры использования команд условного перехода.
Положим, значения длин сторон треугольника обозначены a,bиcи занесены в байтовые переменные с такими же именами. Положим, что в программе осуществляется проверка значений сторон треугольника на предмет его идентификации: является ли треугольник со сторонами a,bиc равносторонним, равнобедренным или общего типа. Заметим, что стороны треугольника всегда принимают положительные значения, поэтому в программе нужно применять условные команды группы “без знака. Приведу фрагмент схемы программы и соответствующие команды на языке ассемблера. Узлом и меткой К обозначены команды завершения программы. Поскольку пока мы не изучили команд прерывания для выдачи сообщений на экран дисплея, в приведенном фрагменте программы такие команды отсутствуют, но отмечены места, где они должны быть вставлены.
MOV AL,A
MOV BL,B
MOV СL,С
CMP AL,BL
JNE NOT_EQABC
ДА CMP BL,CL
JNE NOT_EQABC
. . . . . . . . . . . . . . . .
здесь поместить команды
выдачи
сообщения
НЕТ “треугольник равносторонний”
JMP K ;
переход
; на метку K
NOT_EQABC: CMP AL,BL
JE EQUAL
CMP BL,CL
JE EQUAL
НЕТ CMP AL,CL
JE EQUAL
.
. . . . . . . . . . . . .
здесь поместить команды
выдачи
сообщения
ДА “треугольник обычный ”
JMP K ; переход к К
EQUAL:
. . . . . . . . . . . . . . . . . . .. .
здесь
поместить команды
выдачи сообщения
“треугольник равнобедренный”
К:
RET
Рисунок Фрагмент программы идентификации треугольника
Обратите внимание!Команды сравнения и условного перехода, набранные в приведенном выше фрагменте программы курсивом, реализуют функцию логического И, а команды, набранные обычным шрифтом, реализуют функцию логического ИЛИ.
В следующей таблице приводятся специальные инструкции условного перехода.
мнемокод |
Описание |
Проверяемые флаги |
JCXZ |
Перейти, если CX=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 |
Примером применения логических команд и команд условного перехода может быть следующий фрагмент программы:
ORDX,DX;проверить значение в регистре
JZM1 ;еслиDX=0, перейти на метку М1
JSM2 ;еслиDX<0, перейти на меткуМ2
TESTDX,00000001B;проверить младший бит
JZCHET;если бит нулевой, число вDXчетное
NECHET: . . . . . .;если бит ненулевой, число вDXнечетное
. . . . . Здесь предусмотреть обработку нечетного значения.
Следует отметить, что в этом фрагменте на чет-нечет будут проверяться не все возможные значения, а только значения из определенного диапазона. Подумайте и ответьте: какой это диапазон?