Вход/Регистрация
Ассемблер для процессоров Intel Pentium
вернуться

Магда Юрий

Шрифт:
 

Листинг 5.6. Поиск первого элемента массива, находящегося в диапазоне 50-100

.686

.model flat

option casemap: none

.data

al DD 34, -53, 88, 13, 67

len EQU $-al

.code

find_num proc

lea ESI, a1 ; адрес массива -> ESI

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

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

next:

cmp dword ptr [ESI], 100 ; элемент массива меньше или равен 100?

jle next1 ; да, выполним следующую проверку

jmp next_addr ; число больше 100, перейти

; к следующему адресу

next1:

cmp dword ptr [ESI], 50 ; элемент массива больше или равен 50?

jge found ; да, элемент обнаружен, поместить его

; в регистр ЕАХ и выйти из процедуры

next_addr: ; перейти к следующему элементу массива

add ESI, 4

dec ECX ; декремент счетчика

jnz next ; если содержимое ЕСХ не равно 0,

; перейти к следующей итерации

mov ЕАХ, 0 ; цикл завершен, требуемый элемент

; отсутствует, помещаем в ЕАХ значение О

jmp exit

found:

mov ЕАХ, [ESI] ; найденный элемент -> ЕАХ

exit:

ret

find_num endp

end

В листинге 5.7 представлен модифицированный вариант этой же процедуры, в которой в той или иной форме используются команды setCC.


Листинг 5.7. Модифицированный с использованием команд setCC вариант листинга 5.6



В исходном тексте изменения выделены жирным шрифтом. Смысл изменений достаточно очевиден, замечу лишь, что нам удалось избавиться от двух команд условных переходов и сделать программный код более линейным. При указанных значениях элементов массива по завершении процедуры регистр ЕАХ будет содержать число 88.

Следующая группа команд, которую мы рассмотрим, включает команды cmovCC. Формат этой команды выглядит так:

cmovCC src, dst

Здесь СС – одно из условий (е, ne, nz, le и т. д.), src может быть 16– или 32-разрядным регистром, a dst – 16– или 32-разрядным регистром или ячейкой памяти. Команда проверяет условие и, если оно выполняется, копирует содержимое dst в src. Если условие не выполняется, операнд src остается без изменений. Небольшой пример поможет лучше понять способ использования команд cmovCC:



Если содержимое регистра АХ больше или равно переменной opl, то opl копируется в АХ. Если же содержимое АХ меньше opl, то оба операнда остаются неизменными.

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

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



Этот код сравнивает два целых числа – num1 и num2, помещая большее из них в регистр ЕВХ. Здесь присутствует команда условного перехода jg, выполняющая переход на другую ветвь программного кода, если num1 больше num2. Для модификации программного кода воспользуемся командой cmovl. Новый вариант исходного текста программы выглядит так:



Проанализируем программный код. В регистр EAX помещается первое число (num1), а в EDX – второе (num2). После выполнения показанной ниже команды сравнения будут установлены соответствующие флаги:

cmp EAX, EDX

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

cmovl EAX, EDX

Наконец, содержимое регистра ЕАХ помещается в регистр ЕВХ. Из этого фрагмента видно, что ветвлений и переходов нет. Перед использованием команды cmov CC необходимо проверить, поддерживается ли она данным типом процессора. Такую проверку можно выполнить с помощью команды cpund.

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



Как видно из исходного текста, после команды стр программный код разветвляется. Этого можно легко избежать, если использовать команду cmovl. Более быстродействующий код выглядит так:



В нашем последнем примере представлен окончательный вариант процедуры find num, в которой используются команды set CC и cmovCC (листинг 5.8).

  • Читать дальше
  • 1
  • ...
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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