Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для 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
<< Назад В начало Далее >> |
|