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





До сих пор мы работали с целыми числами. Следующие несколько примеров демонстрируют, как можно в процедурах на ассемблере выполнять операции с вещественными числами. Рассмотрим вначале простой пример суммирования двух вещественных чисел и вывода результата в окно приложения. Операция суммирования выполняется в ассемблерной процедуре, возвращающей в основную программу адрес ячейки памяти, в которой находится результат суммирования.

Исходный текст ассемблерной процедуры для работы с Delphi-приложением представлен в листинге 3.34.
Листинг 3.34. Ассемблерная процедура» выполняющая суммирование двух вещественных чисел
.386
.model flat
public addreals
.data
SUM DD 0
.code
addreals proc
push EBX
push EBP
mov EBP, ESP
mov EBX, DWORD PTR [EBP+12]
mov EDX, DWORD PTR [EBP+16]
finit
fadd
fid DWORD PTR [EBX]
DWORD PTR [EDX]
fstp
fwait
DWORD PTR SUM
mov ЕАХ, offset SUM
pop EBP
pop EBX
ret 8.
addreals endp
end

Первое слагаемое передается в процедуру со смещением 12 в стеке, второе — со смещением 16. Операцию сложения будем выполнять с использованием функций математического сопроцессора (блока выполнения операций с плавающей запятой для процессоров Pentium). Основные команды математического сопроцессора были нами рассмотрены в главе 2, поэтому остановимся на них лишь вкратце.
Команда finit инициализирует сопроцессор. Последующие две команды выполняют операцию суммирования и временно сохраняют результат в вершине стека сопроцессора. Команда:
fstp DWORD PTR SUM
выталкивает результат операции в ячейку памяти и освобождает вершину стека сопроцессора. Адрес ячейки памяти передается в вызывающую программу на Delphi через регистр ЕАХ. Откомпилируем наш ассемблерный модуль при помощи турбо ассемблера TASM:
TASM32 /ml addreals.asm addreals.obj

Демонстрационную программу на Delphi разработаем следующим образом: разместим на главной форме приложения три поля редактирования Edit вместе с метками статического текста Label и кнопку Button. При нажатии на кнопку в поле редактирования с заголовком "xi + X2" отобразится сумма чисел, введенных пользователем в полях " x i " и "Х2".

Сделаем некоторые изменения в исходном тексте шаблона приложения. В секции implementation объявим ассемблерную процедуру:
implementation
{$R *.dfm}
{$L addreals.obj}
function addreals(pXl: PSingle;pX2: PSingle): PSingle; stdcaii; external;

Обратите внимание на то, как описаны указатели в параметрах процедуры и возвращаемый результат. Они имеют тип p s i n g i e и указывают на переменные вещественного типа s i n g l e .
Напишем обработчик нажатия кнопки для нашего приложения (листинг 3.35).
Листинг3.35. Обработчик нажатия кнопки в программе на Delphi procedure TForml.ButtonlClick(Sender: TObject);
begin
XI := StrToFloat(Editl.Text);
X2 := StrToFloat(Edit2.Text);
Edit3.Text := FloatToStrF((addreals(0X1, 0X2))л, ffGeneral, 5, 7);
end;

Этот фрагмент кода выполняет следующие действия:
• записывает в переменные xi и Х2 значения вещественных чисел из полей xl и Х2. Поскольку поле редактирования Edit интерпретирует введенные символы как текст, мы должны преобразовать этот текст в вещественное число. Сделать это довольно просто — в Delphi есть специальная функция StrToFloat, преобразующая строку в вещественное число;
• вызывает внешнюю процедуру addreals с адресами переменных xi и Х2 в качестве параметров и получает адрес суммы в качестве результата.

Далее через операцию разыменования указателя результат сложения передается в функцию FioatTostrF. Эта функция преобразует вещественное число в строковую переменную, которую легко вывести в поле редактирования.
Все вышеописанные действия выполняет один оператор:
Edit3.Text := FloatToStrF((addreals(0X1, 0Х2))Л, ffGeneral,5,7);
Хочу напомнить, что оператор "0" возвращает адрес переменной, а оператор " л " , стоящий после имени переменной-указателя, возвращает значение по этому адресу.


 
 
 

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