Чтение онлайн

на главную - закладки

Жанры

Ассемблер для процессоров Intel Pentium

Магда Юрий

Шрифт:

5.1. Условные переходы и ветвления

Организацию ветвлений в программах на ассемблере лучше всего объяснить на примере. В следующем фрагменте программного кода выполняется переход на метку next при равенстве нулю содержимого регистра ЕСХ. Равенство нулю содержимого ЕСХ определяется при помощи команды стр, которая воздействует на флаги AF, CF, OF, PF, SF и ZF:

. . .

cmp ЕСХ, 0

jz next

обработка ситуации, когда ЕСХ не равен О

next:

обработка ситуации, когда ЕСХ равен О

. . .

Если ЕСХ содержит нулевое значение, то команда стр устанавливает флаг нуля ZF в единицу. Команда jz проверяет флаг ZF и, если он равен 1, передает управление на адрес, указанный в ее операнде, то есть на метку next. Фактически данный фрагмент программного кода реализует логическую структуру if, анализирующую условие ЕСХ = 0.

Этот пример демонстрирует один из типичных вариантов организации ветвлений с использованием команды стр. В данном случае эта команда устанавливает или сбрасывает флаг ZF, в зависимости от равенства или неравенства нулю содержимого регистра ЕСХ. Состояние флага анализируется командой jz next, после чего осуществляется переход на одну из двух возможных ветвей программного кода. Большинство команд процессоров Intel воздействуют на флаги, что позволяет задействовать их для организации довольно сложных вычислительных алгоритмов.

Наиболее часто для организации ветвлений используются команды сравнения (cmp, test), a также арифметические (add, sub и др.) и логические команды (and, or, xor). Например, команда test выполняет операцию логического «И» над двумя операндами и в зависимости от результата устанавливает флаги SF, ZF и PF. При этом флаги OF и CF сбрасываются, а флаг AF имеет неопределенное значение. Очень важно то, что команда test не изменяет ни одного из операндов. Ее очень удобно использовать для анализа отдельных битов сравниваемых величин, как в этом примере:

. . .

test AX, 1

jne bitl_set

. . .

Здесь анализируется нулевой бит регистра АХ. Если он установлен в 1, то флаг ZF устанавливается в 0 и выполняется переход на метку bitltest.

Ассемблер поддерживает большое количество команд условного перехода, которые осуществляют передачу управления в зависимости от состояний регистра флагов. При этом следует учитывать некоторые особенности использования таких команд. В подавляющем большинстве случаев команды условных переходов оперируют флагами, установленными в результате сравнения числовых величин. Типы данных, над которыми выполняются арифметические операции и операции сравнения, определяют выбор команд: беззнаковые или знаковые. Типичными примерами беззнаковых данных являются символьные строки, имена, адреса и натуральные числа. Многие числовые значения могут быть как положительными, так и отрицательными.

Например, если регистр АХ содержит 11000110В, а ВХ – 00010110В, то для беззнаковых данных значение в АХ будет больше ВХ, а для знаковых – меньше. Перечень команд условных переходов для беззнаковых данных приведен в табл. 5.1.


Таблица 5.1. Команды условных переходов для чисел без знака



Любую проверку можно выполнить с помощью одного из двух мнемонических кодов. Например, команды jb и jnae генерирует один и тот же объектный код, хотя мнемоническое обозначение команды jb понять легче, чем jnae.

Перечень команд условных переходов для знаковых данных приведен в табл. 5.2.


Таблица 5.2. Команды условных переходов для чисел со знаком



Обратите внимание на то, что команды перехода для условий равно или нуль (je/jz) и не равно или не нуль (jne/jnz) присутствуют в обеих таблицах для беззнаковых и знаковых данных. Состояние равно/нуль не зависит от знака числа.

Помимо проверок на равенство-неравенство операндов, очень часто требуется анализировать и другие флаги. Все такие проверки представлены в табл. 5.3.


Таблица 5.3. Команды условных переходов для специальных проверок



Еще одна команда условного перехода проверяет равенство содержимого регистра СХ нулю. Эта команда необязательно должна располагаться непосредственно за арифметической командой или командой сравнения. Команда jcxz может быть помещена в начало цикла, где она проверяет содержимое регистра СХ.

5.2. Команда безусловного перехода jmp

При выполнении команды безусловного перехода jmp, независимо от состояния флагов процессора, программа продолжает выполняться с новой ветви. При этом новый адрес команды загружается в регистр-счетчик команд EIP и выполнение программного кода продолжается с этого адреса.

В языке ассемблера новое место, откуда продолжается выполнение программы, в большинстве случаев обозначается меткой, которую процессор преобразует в исполнительный адрес. Если переход происходит в текущий сегмент, то смещение метки загружается непосредственно в регистр-счетчик команд El Р. Если же метка находится в другом сегменте кода, то адрес сегмента дополнительно загружается в регистр CS. Для преобразования метки в вид сегментхмещение используются три формата команды jmp:

jmp short целевой_адрес

jmp near ptr целевой_адрес

jmp far ptr целевой_адрес

Здесь целевой_адрес – адрес команды, которая будет выполняться после перехода. Вот несколько примеров команды jmp:

jmp labell ; адрес команды, которая будет выполняться при

; переходе, находится в текущем сегменте команд

jmp near ptr labell ; адрес следующей команды находится

; в текущем сегменте команд

jmp short labell ; адрес команды, которая будет выполняться

; при переходе, находится в диапазоне

; -128 – +127

jmp far ptr labell ; адрес команды, которая будет

; выполняться при переходе, находится

; в другом сегменте

Рассмотрим операторы, указанные перед целевым адресом. Оператор short указывает на то, что нужно сделать переход на метку в диапазоне от -128 до +127, начиная от адреса следующей команды. В этом случае к содержимому регистра указателя команд EIP прибавляется 8-разрядное целое число.

Оператор near ptr указывает на метку в текущем сегменте, при этом к регистру указателя команд EIP прибавляется 16-разрядное смещение. Наконец, оператор far ptr указывает, что необходимо сделать переход на метку в другом сегменте. В этом случае сегментная часть адреса метки загружается в регистр CS, a смещение – в El Р.

Поделиться:
Популярные книги

Заход. Солнцев. Книга XII

Скабер Артемий
12. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Заход. Солнцев. Книга XII

Страж Кодекса. Книга III

Романов Илья Николаевич
3. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Страж Кодекса. Книга III

Неправильный лекарь. Том 1

Измайлов Сергей
1. Неправильный лекарь
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Неправильный лекарь. Том 1

Альбион сгорит!

Зот Бакалавр
10. Герой Империи
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Альбион сгорит!

Наша навсегда

Зайцева Мария
2. Наша
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Наша навсегда

Кодекс Охотника. Книга XIX

Винокуров Юрий
19. Кодекс Охотника
Фантастика:
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XIX

Имя нам Легион. Том 1

Дорничев Дмитрий
1. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 1

На границе империй. Том 10. Часть 2

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
5.00
рейтинг книги
На границе империй. Том 10. Часть 2

Кай из рода красных драконов 2

Бэд Кристиан
2. Красная кость
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кай из рода красных драконов 2

Здравствуй, 1985-й

Иванов Дмитрий
2. Девяностые
Фантастика:
альтернативная история
5.25
рейтинг книги
Здравствуй, 1985-й

Лейтенант космического флота

Борчанинов Геннадий
1. Звезды на погонах
Фантастика:
боевая фантастика
космическая фантастика
космоопера
рпг
фэнтези
фантастика: прочее
5.00
рейтинг книги
Лейтенант космического флота

Патриот. Смута

Колдаев Евгений Андреевич
1. Патриот. Смута
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Патриот. Смута

Последний Паладин. Том 10

Саваровский Роман
10. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 10

Сильнейший Столп Империи. Книга 2

Ермоленков Алексей
2. Сильнейший Столп Империи
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 2