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

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

Жанры

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

Магда Юрий

Шрифт:

Пример представляет собой 32-разрядную процедуру (она называется easel). В качестве входного параметра процедура принимает целое число из диапазона 0-2, а в регистре ЕАХ возвращает адрес строки, соответствующий значению параметра. Принципы организации процедур мы рассмотрим в следующих главах, сейчас же акцентируем наше внимание на работе программного кода процедуры easel, не вникая в детали ее взаимодействия с другими частями программы.

Для извлечения единственного параметра используется регистр EBP, a сам параметр для выполнения дальнейших манипуляций помещается в регистр ЕВХ. Исходный текст процедуры представлен в листинге 5.2.


Листинг 5.2. Ассемблерный аналог конструкции case

.686

.model flat

option casemap: none

.data

s1 DB «String 1», 0

s2 DB «String 2», 0

s3 DB «String 3», 0

err DB «Incorrect parameter!», 0

label_array label dword ; массив меток, в котором будут

; находиться смещения

; меток LI, L2 и L3

DD 3 DUP (?)

.code

_case_l proc

push EBP mov EBP, ESP

mov EBX, dword ptr [EBP+8] ; извлекаем параметр (номер строки)

; и сохраняем его в регистре ЕВХ

lea ESI, label_array ; адрес массива меток -> ESI

mov [ESI], offset LI ; заполняем массив меток смещениями

mov [ESI+4], offset L2 ; меток LI, L2 и L3 mov [ESI+8], offset L3

lea EAX, err_exit ; сохраняем в регистре ЕАХ смещение

; метки для выхода из процедурь

; в случае ошибки

shl ЕВХ, 2 ; поскольку для адресации

; используются двойные слова,

; умножаем номер строки на 4

сmp ЕВХ, 8 ; значение учетверенного параметра

; не должно превышать 8 (номер строки

; лежит в диапазоне 0-2)

jle next1 ; верхнее значение меньше 8? Если

; да, следующая проверка

jmp EAX ; нет, параметр превышает значение 2,

; выйти из процедуры с ошибкой

next1 :

cmp EBX, 0 ; параметр не является отрицательным

; числом? Если

jge get_string ; нет, продолжить выполнение

; процедуры

jmp EAX ; да, параметр вне диапазона, выйти

; с ошибкой

get_string: ; параметр находится в нужном

; диапазоне, получить адрес

; соответствующей строки и выйти из

; процедуры

cmovge EAX, [ESI][EBX]

jmp EAX

L1: ; сюда передается управление при

; значении входного параметра,

; равном 0

lea EAX, s1 ; адрес строки s1 -> EAX

jmp exit ; выход из процедурь

L2: ; сюда передается управление при

; значении входного параметра,

; равном 1

lea EAX, s2 ; адрес строки s2 -> EAX

jmp exit ; выход из процедурь

L3: ; сюда передается управление при

; значении входного параметра,

; равном 2

lea EAX, s3 ; адрес строки s3 -> EAX

jmp exit ; выход из процедурь

err_exit: ; сюда передается управление

; при возникновении ошибки

lea EAX, err ; адрес сообщения об ошибке -> ЕАХ

exit:

pop EBP

ret

_case_l endp

end

Анализ работы процедуры начнем со строк

lea ESI, label_array

mov [ESI], offset L1

mov [ESI+4], offset L2

mov [ESI+8], offset L3

Как и в предыдущем примере, вначале заполняем массив меток смещениями используемых ветвей программы. Поскольку 32-разрядные приложения работают со смещениями, равными двойному слову, то наш массив labelarray состоит из трех двойных слов, в которых и сохраняются смещения меток LI, L2 и L3. Все эти действия и выполняют четыре команды, показанные выше.

Следующая команда помещает в регистр ЕАХ смещение метки, куда должно передаваться управление в случае ошибки:

lea EAX, err_exit

Для передачи управления в нашей процедуре используется команда

jmp EAX

Она принимает в качестве операнда регистр (в данном случае – ЕАХ), содержащий смещение команды, куда передается управление.

С помощью следующей команды устанавливается смещение одной из меток (LI, L2 или L3), в которую должно передаваться управление при корректном значении параметра процедуры:

sh1 EBX, 2

Фрагмент программного кода, в котором выполняется проверка параметра на принадлежность диапазону 0-2, думаю, понятен и в объяснениях не нуждается. Если полученный параметр корректен, то выполняется команда

cmovge EAX, [ESI][EBX]

Остановимся на работе этой инструкции ассемблера более подробно. Описание группы команд, к которой принадлежит cmovge, приводится далее в этой главе, но в нашем случае эта инструкция выполняет две функции:

– анализирует результат предыдущей операции (флаг SF);

– если SF = 1, то в регистр ЕАХ помещается смещение одной из меток (LI, L2 или L3). Само смещение находится по адресу, равному сумме адресов массива label_агтау (регистр ESI) и индекса строки (регистр ЕВХ).

Подобную процедуру при желании можно усовершенствовать и использовать для организации ветвлений в программах на ассемблере.

5.3. Организация циклов

Очень часто условные переходы используются при программировании циклических операций, или циклов, когда обрабатывается группа элементов. Количество итераций (прохождений) в цикле чаще всего определяется количеством обрабатываемых элементов, хотя это и не обязательно. Цикл может закончиться в одном из двух случаев:

– выполнены все итерации;

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

Старая школа рул

Ромов Дмитрий
1. Второгодка
Фантастика:
альтернативная история
6.00
рейтинг книги
Старая школа рул

Черный дембель. Часть 1

Федин Андрей Анатольевич
1. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 1

Отмороженный 7.0

Гарцевич Евгений Александрович
7. Отмороженный
Фантастика:
рпг
аниме
5.00
рейтинг книги
Отмороженный 7.0

Древесный маг Орловского княжества 6

Павлов Игорь Васильевич
6. Орловское княжество
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 6

Кодекс Императора IV

Сапфир Олег
4. Кодекс Императора
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Императора IV

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

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

Офицер

Земляной Андрей Борисович
1. Офицер
Фантастика:
боевая фантастика
7.21
рейтинг книги
Офицер

Газлайтер. Том 16

Володин Григорий Григорьевич
16. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 16

Матабар

Клеванский Кирилл Сергеевич
1. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар

Позывной "Князь" 4

Котляров Лев
4. Князь Эгерман
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Позывной Князь 4

Деревенщина в Пекине

Афанасьев Семён
1. Пекин
Фантастика:
попаданцы
дорама
фантастика: прочее
5.00
рейтинг книги
Деревенщина в Пекине

Барон Дубов 2

Карелин Сергей Витальевич
2. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Барон Дубов 2

На границе империй. Том 6

INDIGO
6. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.31
рейтинг книги
На границе империй. Том 6

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

Сапфир Олег
39. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
боевая фантастика
5.00
рейтинг книги
Кодекс Охотника. Книга XXXIX