Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


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





Должен заметить, что имя файла объектного модуля может и не совпадать с именем вызываемой процедуры или функции. Необязательно также, чтобы модуль subtwo.obj содержал процедуру subtwo с тем же именем. Более того, объектный модуль может содержать несколько процедур или функций.
Следующей строкой можно объявить вызываемую процедуру:
function subtwo(il: Integer; i2: Integer): Integer; stdcaii; external;

Директива external указывает на то, что вызываемая процедура является внешней по отношению к вызывающей программе и находится в другом, возможно внешнем модуле. Директива stdcaii указывает компилятору правила, по которым параметры il и i2 обрабатываются в вызываемой процедуре.
Далее напишем обработчик нажатия кнопки (листинг 3.21).
Листинг 3.21. Обработчик нажатия кнопки
procedure TForml.ButtonlClick(Sender: TObject);
var
II, 12: Integer;
begin
11 := StrToInt(IlEdit.Text);
12 := StrToInt(l2Edit.Text);
subResult.Text := IntToStr(subtwo(II, 12));
end;

Обработчик представляет собой обычную процедуру, в которой мы объявили две переменные целого типа п и 12 и написали несколько операторов.
Введенные в поля редактирования текстовые представления и и 12 преобразуются в целые числа при помощи функции StrToInt:
11 := StrToInt(IlEdit.Text);
12 := StrToInt(l2Edit.Text) ;
Далее программа отображает результат вычитания в поле редактирования subResuit при помощи оператора:
subResult.Text := IntToStr((subtwo(II, 12)));

Здесь целочисленный результат, возвращаемый процедурой subtwo, преобразуется в текст функцией IntToStr и отображается в поле редактирования.

Как вы заметили, процедура subtwo использует в качестве параметров двойные слова (DWORD) и возвращает результат также, в виде двойного слова. Компилятор Delphi корректно преобразует целочисленные величины типа integer в двойные слова, поэтому ошибок не возникает. Мы могли бы, к примеру, в секции определения переменных нашей программы написать:
var
I I , 12: DWORD;

Функции strToint и intTostr в этом случае отрабатывают корректно.
Нужно быть очень внимательным при преобразовании типов, т. к. ошибки преобразования очень трудно поддаются анализу и не всегда отслеживаются компиляторами! Это касается как приложений на Delphi, так и на Visual С++ .NET.
И еще одно. Не забудьте скопировать файл subtwo.obj в рабочий каталог нашего проекта, иначе компоновщик не сможет найти объектный файл с нашей процедурой.
Рассмотрим этот же пример, но в реализации Microsoft Visual С++ .NET (листинг 3.22). Первое, что мы сделаем — это изменим идентификаторы имен в нашей ассемблерной процедуре.
Листинг 3.22. Ассемблерная процедура, вычисляющая разность двух целых чисел, для использования в С++
.386
.model flat
public _subtwo@8
.data
code
subtwo@8 proc
push EBP
mov EBP, ESP
mov EAX, DWORD PTR [EBP+8]
sub EAX, DWORD PTR [EBP+12]
pop EBP
ret 8
subtwo@8 endp
end

Имя процедуры subtwo изменилось на _subtwo@8 в соответствии с соглашением stdcaii для работы с компилятором С + + .NET. Скомпилируем наш ассемблерный модуль:
ml /с /Fo subtwo.obj subtwo.asm


 
 
 

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