Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей
|
Сохраним наш исходный текст в файле с расширением ASM и откомпилируем
приложение.
Операции сложения и вычитания с повышенной точностью можно выполнять
и для многобайтных операндов. В предыдущих двух примерах мы выполняли
действия с целыми числами, которые в большинстве систем программирования
представлены как двойное слово (4 байта). Однако не
следует полагаться на то, что переменные целого типа обязательно будут
иметь размерность в 4 байта! Поскольку многие ассемблерные программы
работают совместно с языками высокого уровня, необходимо четко представлять,
какие типы данных и какой размерности использует компилятор
С++ .NET или Delphi.
В компиляторе Visual С++ .NET, например, существует несколько типов
переменных целого типа, имеющих различную размерность. При работе с
этим компилятором с уверенностью можно полагаться только на тип intx,
где х может принимать значения 8, 16, 32, 64. Это так называемый тип целочисленных
данных с фиксированной размерностью.
Кроме того, приложения на ассемблере широко используют функции WIN
API, которые оперируют разными типами данных. Необходимо внимательно
относится к использованию переменных при вызове этих функций. Неправильный
формат данных (не только целочисленных) приводит к трудно обнаруживаемым
ошибкам.
В программистской практике редко бывает так, чтобы все числовые величины
имели одинаковую размерность. В рассмотренном выше примере
сложения двух целых чисел оба операнда имели размерность двойного слова.
Предположим, что один из этих операндов является байтом. Как в этом
случае выполнить операцию сложения, которая требует два операнда одинаковой
размерности? В этих случаях используются так называемые команды
преобразования типа. При помощи таких команд можно расширить байт
до слова, а слово — до двойного слова. Двойные слова можно расширить до
учетверенных слов. К командам преобразования типов относятся:
П cbw— команда преобразования байта в регистре AL в слово в регистре
АХ. При таком преобразовании старший бит в регистре AL расширяется
на все биты регистра АН;
cwd— команда преобразования слова в регистре АХ в двойное слово в
регистрах DX:AX. В этом случае старший бит регистра АХ расширяется на
биты регистра DX;
• cwde— команда преобразования слова в регистре АХ в двойное слово в
регистре ЕАХ через расширение старшего бита АХ на старшие 16 бит регистра
ЕАХ;
• cdq— команда преобразования двойного слова в регистре ЕАХ в учетверенное
слово в регистрах EDX:EAX через расширение старшего бита в регистре
ЕАХ на все биты EDX.
Изменим пример для нахождения суммы двух целых чисел, предположив,
что один из операндов представляет собой байт. Фрагменты кода, которые
необходимо вставить в исходный текст программы, приведены в листинге
2.14.
Листинг 2.14. Фрагменты кода, выполняющие сложейие двух операндов,
один из которых — байт
.data
conTitle
mes
en_mes
charBuf
DB "Assembler console application", 0
DB "The result of adding 3600 and -18 = ", 0
EQU $-mes
DB " " 0
len charBuf DD $-charBuf
ibl
idl
id2
lpFmt
DB
DD
DD
DB
-18
0
3600
"%d"#
mov
cbw
cwde
mov
mov
add
mov
adc
AL, ibl
idl, EAX
AX, WORD PTR idl
WORD PTR id2, AX
AX, WORD PTR idl+2
WORD PTR id2+2, AX
Одним из операндов в модифицированной программе является целочисленная
переменная ibl размерностью в 1 байт. Как видно из фрагмента кода,
преобразование выполняется в два этапа: сначала 1-байтовая переменная
загружается в регистр AL, где преобразуется в слово, затем слово в регистре
ЕАХ преобразуется в двойное слово и помещается в регистр ЕАХ. Далее мы
помещаем переменную из регистра ЕАХ в переменную idl. Затем выполняется
сложение двух чисел в переменных idl и id2 обычным способом.
Следующий пример демонстрирует, как найти сумму элементов целочисленного
массива, используя операции сложения с повышенной точностью.
<< Назад В начало Далее >> |
|