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

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

Жанры

Ассемблер для процессоров 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 Р.

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

Лекарь Империи 6

Карелин Сергей Витальевич
6. Лекарь Империи
Фантастика:
городское фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Лекарь Империи 6

Крестоносец

Ланцов Михаил Алексеевич
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Крестоносец

Идеальный мир для Лекаря 21

Сапфир Олег
21. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 21

Фишер. По следу зверя. Настоящая история серийного убийцы

Рогоза Александр
Реальные истории
Документальная литература:
истории из жизни
биографии и мемуары
5.00
рейтинг книги
Фишер. По следу зверя. Настоящая история серийного убийцы

Олд мани

Голд Яна
Любовные романы:
современные любовные романы
остросюжетные любовные романы
фемслеш
5.00
рейтинг книги
Олд мани

Я – Легенда

Гарцевич Евгений Александрович
1. Я - Легенда!
Фантастика:
боевая фантастика
попаданцы
рпг
фантастика: прочее
5.00
рейтинг книги
Я – Легенда

Изгой Проклятого Клана. Том 2

Пламенев Владимир
2. Изгой
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Изгой Проклятого Клана. Том 2

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

INDIGO
16. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 3

Локки 7. Потомок бога

Решетов Евгений Валерьевич
7. Локки
Фантастика:
аниме
эпическая фантастика
фэнтези
5.00
рейтинг книги
Локки 7. Потомок бога

Орден Архитекторов 11

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

Законы Рода. Том 13

Андрей Мельник
13. Граф Берестьев
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 13

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

Винокуров Юрий
25. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Кодекс Охотника. Книга XXV

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

Винокуров Юрий
14. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XIV

Тринадцатый VIII

NikL
8. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый VIII