Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей
|
Посмотрим теперь, как наша процедура будет вызываться из Delphi и С + + .
Начнем с Delphi. Фрагмент кода для этого случая приведен в листинге 3.14.
Листинг 3.14. Вызов ассемблерной процедуры из программы на Delphi
implementation
{$R *.dfm}
($L ADDINTS.OBJ}
function Addlnts(Xl: Integer; X2: Integer): Integer; stdcall; external;
var
XI, X2: Integer;
SUM: Integer;
begin
XI := 23;
Х2 := -67;
SUM := AddInts(Xl, Х2);
Строка {$L ADDINTS .OBJ} указывает компилятору и компоновщику на то,
что будет использован внешний объектный файл. Строка
function Addints(Xl: Integer; Х2: Integer): Integer; stdcaii; external;
определяет поведение вызывающей процедуры.
Во-первых, директива stdcaii (см. табл. 3.1) указывает на то, что параметры
xi и Х2 передаются через стек справа налево, т. е. первым в стек помещается
Х2, затем xl. Поскольку стек растет от больших адресов памяти к меньшим,
то х2 будет размещаться по большему адресу, a xi — по меньшему.
Директива external объявляет процедуру Addints внешней, т. е. расположенной
в другом модуле. Ключевое слово function указывает на то, что
процедура возвращает значение в вызывающую программу. Думается, не
возникнет путаницы с определением процедуры или функции в языках высокого
уровня и употреблением этого термина в тексте книги.
Параметры xi и Х2 являются целыми переменными, и в процедуру Addlnts
передаются их значения. Это видно из определения xi и х2 в секции var
объявления переменных.
Результат сложения, как видно из исходного текста процедуры Addlnts,
возвращается в регистре ЕАХ. Возвращая управление основной программе,
процедура Addlnts в соответствии с директивой stdcaii должна сама восстановить
стек. Перед последней командой ret там находятся два двойных
слова, т. е. 8 байт. Чтобы удалить их из стека, необходимо в команде ret
указать параметр 8. Можно использовать вместо ret 8 последовательность
команд:
add ESP, 8
ret
Сохраним исходный текст нашей программы в файле Addlnts.asm. Имя исходного
файла никак не связано с нашей процедурой, и выбрали мы его
только для удобства.
Далее необходимо откомпилировать наш ASM-файл. Командная строка для
компилятора Borland TASM 5.0 будет выглядеть так:
tasm32 /ml Addlnts.asm
Параметр mi вынуждает компилятор различать регистр символов. Для компилятора
MASM 6.14 командная строка будет выглядеть иначе:
ml /с Addlnts.asm
Опция /с указывает компилятору, что необходима только трансляция исходного
модуля, что нам и нужно для получения файла объектного модуля.
Если компиляция исходного модуля прошла успешно, то мы получим файл
Addlnts.obj, с которым и будем далее работать. Не забудем скопировать наш
объектный модуль в рабочий каталог Delphi-приложения перед компоновкой
всего приложения.
Рассмотрим, как изменится наша процедура и ее вызов в среде программирования
Visual С + + .NET. Напомним, что мы работаем с вызываемой процедурой,
используя директиву stdcaii. Внесем коррективы в исходный
текст нашей процедуры Addlnts.
<< Назад В начало Далее >> |
|