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

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


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


 
 
 

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