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