Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для 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 обычным способом.
Следующий пример демонстрирует, как найти сумму элементов целочисленного массива, используя операции сложения с повышенной точностью.


 
 
 

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