Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Проанализируем приведенный код.
Вспомним, что мы работаем с 32-разрядными операндами, поэтому все переменные и регистры описаны соответствующим образом. Команда сравнения cmp не работает с операндами, находящимися в оперативной памяти, поэтому один из операндов (в данном случае Y) сперва помещается в регистр ЕАХ. Еще один важный момент: поскольку программы на языках высокого уровня работают в основном с переменными в памяти, очень удобно результат вычислений помещать сразу в переменную, например в х.

Решим такую задачу: необходимо найти сумму двух целых чисел х и у при условии, что оба они находятся в диапазоне от i до юо.
В Delphi фрагмент программы с использованием инструкции if мог бы выглядеть так:
if (X <= 100) and (X >= 1) then
• if (Y <= 100) and (Y >= 1) then
X : = X + Y;

В Visual С + + этот фрагмент будет выглядеть следующим образом:
if ((X <= 100 && X >= 1) && (Y <= 100 && Y >= 1))
X = X + Y

Программный код на ассемблере представлен в листинге 3.1.
Листинг 3.1. Фрагмент программы на ассемблере, использующей аналог инструкции if для сложения двух целых чисел
cmp DWORD PTR X, 1
jge check _xl00
jmp ' EXIT
check _xl00:
cmp DWORD PTR X, 100
jle check _yi
jmp EXIT
check _yl:
cmp DWORD PTR Y, 1
jge check _yl00
jmp EXIT
check ylOO:
cmp DWORD PTR Y, 100
jg EXIT
mov EAX, DWORD PTR Y
add DWORD PTR X, EAX
EXIT:

Как видно из алгоритма, для получения суммы чисел х и Y необходимо проанализировать как минимум четыре условия:
• х больше или равно i;
• х меньше или равно юо;
• Y больше или равно 1;
• Y меньше или равно ю о .

Только при одновременном выполнении всех четырех условий переменной х может быть присвоено значение суммы х + Y. ДЛЯ решения такой задачи необходимо представить условие
(X <= 100 && X >= 1) && (Y <= 100 && Y >= 1)
в виде более простых конструкций. Это выражение распадается на четыре условия:
X <= 100, X >= 1, Y <= 100, Y >= 1

Задача упростилась. Каждое из полученных четырех условий легко проверяется с помощью команды стр. Например, проверка х <= юо и последующий переход выполняются так:
cmp DWORD PTR X, 100

Остальные проверки можно выполнить с помощью аналогичных комбинаций команд.
Надо заметить, что ассемблерный аналог конструкций на языках высокого уровня может быть достаточно завуалирован и с первого взгляда неочевиден, что видно из следующего примера.
Предположим, необходимо найти модуль (абсолютное значение) целого числа х. Один из вариантов решения такой задачи — использование конструкции if-else.
Вот исходный текст программного кода для Delphi:
if X >= 0 then
AbsX := X
else
AbsX := -X;
где AbsX — переменная, в которой хранится модуль х.

Вариант использования конструкции if-else на Visual С + + :
if (X >= 0)
AbsX = X
else
AbsX = -X
Ассемблерная реализация такой конструкции выглядит следующим образом:
cmp DWORD PTR X, 0
j 1 NOT_X
jmp EXIT
NOT_X:
neg DWORD PTR X
EXIT:
mov EAX, DWORD PTR X
mov DWORD PTR AbsX, EAX

И в ветви if, и в ветви else выполняется оператор присваивания. По смыслу можно объединить эти два присваивания, поместив их в конец фрагмента кода:
mov ЕАХ, DWORD PTR X
mov DWORD PTR AbsX, EAX

Ветвь else представлена на ассемблере командой:
NOT_X:
neg DWORD PTR X


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru