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

на главную

Жанры

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

Магда Юрий

Шрифт:

mov CX, len ; размер строки -> СХ

mov a1, ' ' ; шаблон для сравнения -> AL

next:

inc SI ; переход к адресу следующего элемента

cmp byte ptr [SI], AL ; сравнить элемент строки с пробелом

loope next ; повторять, пока не будет обнаружен символ,

; отличный от пробела,

; либо не будет достигнут

; конец строки

cmp CX, 0 ; был достигнут конец строки?

je fail ; да, строка состоит из пробелов,

; вывести соответствующее сообщение

mov DX, SI ; нет,

в строке есть другие символы,

; поместить адрес первого символа,

; отличного от пробела, в регистр DX

show:

mov АН, 9h ; отобразить сообщения

int 21h

mov АН, lh

int 21h

mov AX, 4C00h

int 21h

fail:

lea DX, msg

jmp show

end start

end

Перейдем к анализу команды 1 oopne/1 oopnz. Отличие этой команды от loopе/1 oopz состоит в том, что цикл выполняется, пока выполняется условие ZF = 0. Обозначения loopпе и 1 oopnz являются синонимами и относятся к одной и той же команде. Пример использования команды loopпе приводится в листинге 5.4. Как и в предыдущем примере, это 16-разрядное приложение, которое выводит на экран дисплея часть строки, следующей за символом + (то есть String 2).

Листинг 5.4. Вывод на экран части строки после символа +

.model small

.data

s1 DB «String 1+String 2$»

len EQU $-s1

msg DB «Char + not found!$»

.code

start:

mov AX, @data

mov DS, AX

lea s1 , s1

dec SI

mov CX, len

mov a1, '+'

next:

inc SI

cmp byte ptr [SI], AL

loopne next

cmp CX, 0

je fail

mov DX, s1

show:

mov AH, 9h

int 21h

mov AH, lh

int 21h

mov AX, 4C00h

int 21h

fail:

lea DX, msg

jmp show

end start

end

Как видно из примеров, команда loop и ее модификации очень удобны для организации вычислительных алгоритмов, поскольку избавляют программиста от необходимости дополнительного кодирования и проверки условий. Последняя

команда, которую мы рассмотрим, является модификацией обычной команды loop, но предназначена она для работы с двойными словами. Такая команда очень полезна при разработке 32-разрядных приложений, которые в большинстве случаев оперируют двойными словами.

Эта команда обозначается как loopd, и основное ее отличие от команды loop состоит в том, что в качестве счетчика цикла используется регистр ЕСХ, содержимое которого в конце каждой итерации уменьшается на 4. Напомню, что двойное слово занимает в оперативной памяти 4 байта, а счетчик ЕСХ содержит размер области памяти в байтах. Адрес следующего обрабатываемого элемента отстоит от текущего на 4 в сторону увеличения или уменьшения, в зависимости от алгоритма задачи. Команда loopd оперирует с теми же флагами, что и loop. Должен заметить, что команда loopd не включена в ранние модели процессоров Intel.

В

качестве примера выполнения цикла с использованием команды loopd приведу 32-разрядную процедуру, выполняющую поиск в массиве целых чисел первого элемента, меньшего -100. В случае удачного поиска процедура возвращает значение этого элемента в регистре ЕАХ, в случае неудачи – 0 в этом же регистре. Исходный текст процедуры (она называется _loopdex) приведен в листинге 5.5.

Листинг 5.5. Поиск первого элемента массива, меньшего -100

.586

.model flat

option casemap: none

.data

al DD 312, -45, 91, -16, -377 ; сканируемый массив

len EQU $-al ; размер массива в байтах

.code

_loopd_ex proc

mov ECX, len ; размер массива в байтах -> ЕСХ

shr ECX, 2 ; преобразовать размер в двойные слова

lea ESI, a1 ; адрес первого элемента -> ESI

mov ЕАХ, -100 ; шаблон для сравнения -> ЕАХ

next:

cmp ЕАХ, [ESI] ; сравнить элемент массива

; с содержимым регистра ЕАХ

jge found ; число в массиве меньше -100,

; закончить программу

add ESI, 4 ; число больше -100, перейти

; к следующему элементу массива

loopd next ; следующая итерация

jmp not_found ; массив проверен, чисел меньше -100 нет

found:

mov ЕАХ, [ESI] ; значение элемента массива -> ЕАХ

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

not_found:

mov ЕАХ, 0 ; при неудачном поиске в регистр ЕАХ

; помещается О

exit:

ret

_loopd_ex endp

end

Исходный текст процедуры несложен и в дополнительных объяснениях не нуждается, нужно лишь помнить, что процедура оперирует двойными словами, и указывать следующий адрес на 4 больше предыдущего.

5.4. Оптимизация кода в процессорах Intel Pentium

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

Однако в целом ряде случаев производительность программы выходит на первое место, а система команд процессоров Intel Pentium, особенно для последних моделей, позволяет ее повысить. В этом разделе мы рассмотрим некоторые вопросы, связанные с повышением эффективности программ.

Быстродействие программы в значительной степени определяется алгоритмом вычислений, а также количеством ветвлений и переходов. Кроме этого, большое влияние на производительность программы оказывают характер ветвлений и организация циклических вычислений там, где они необходимы.

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

Бастард Императора

Орлов Андрей Юрьевич
1. Бастард Императора
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Бастард Императора

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

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

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

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

Измена. Вторая жена мужа

Караева Алсу
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Вторая жена мужа

Буря империи

Сай Ярослав
6. Медорфенов
Фантастика:
аниме
фэнтези
фантастика: прочее
эпическая фантастика
5.00
рейтинг книги
Буря империи

Пенсия для морского дьявола

Чиркунов Игорь
1. Первый в касте бездны
Фантастика:
попаданцы
5.29
рейтинг книги
Пенсия для морского дьявола

На изломе чувств

Юнина Наталья
Любовные романы:
современные любовные романы
6.83
рейтинг книги
На изломе чувств

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

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

Сирота

Шмаков Алексей Семенович
1. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Сирота

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

Flow Ascold
9. Граф Берестьев
Фантастика:
городское фэнтези
попаданцы
аниме
дорама
фэнтези
фантастика: прочее
5.00
рейтинг книги
Законы Рода. Том 9

Красноармеец

Поселягин Владимир Геннадьевич
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Красноармеец

Огненный князь 4

Машуков Тимур
4. Багряный восход
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Огненный князь 4

Начальник милиции. Книга 5

Дамиров Рафаэль
5. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 5

Инкарнатор

Прокофьев Роман Юрьевич
1. Стеллар
Фантастика:
боевая фантастика
рпг
7.30
рейтинг книги
Инкарнатор