Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей
|
Необходимо добавить в имени вызываемой процедуры символ подчеркивания
и суффикс @п, где п — число байт, требуемое для передачи параметров.
В данном случае п равно 8. Такая форма именования процедуры отвечает
требованиям компилятора С + + для корректной работы. С учетом
этих изменений исходный текст будет выглядеть так, как показано в листинге
3.15.
Листинг 3.15. Процедура на ассемблере, скорректированная для вызова из С++
.386
.model flat
public _AddInts@8
.data
.code
_AddInts@8 proc
push EBP
mov EBP, ESP
mov EAX, DWORD PTR [EBP+8]
add EAX, DWORD PTR [EBP+12]
pop EBP
ret 8
_AddInts@8 endp
end
Как видно из исходного текста, единственный параметр, который подвергся
изменению по сравнению с Delphi, — это имя процедуры. Компиляция выполняется
так же, как и в предыдущем варианте. Для компилятора TASM:
tasm32 /ml Addints.asm
или для MASM:
ml /с Addints.asm
Теперь посмотрим, как выглядит программный код, вызывающий ассемблерные
процедуры из С + + .NET. Прежде всего мы должны описать вызываемую
процедуру в разделе описаний переменных и функций:
extern "?" int stdcaii Addints(int il, int i2);
Фрагмент программы, выполняющей вычисления с использованием внешней
процедуры Addlnts, мог бы выглядеть так:
int II = 74;
int 12 = -56;
int ires;
ires = Addlnts(II, 12);
Спецификатор "С" запрещает компилятору С++ декорировать имя внешнего
идентификатора. Декорирование имен (name decoration) — это стандартная
технология компилятора С++, при которой происходит расширение
имени с помощью дополнительных символов, несущих информацию о типе
каждого параметра. Директива extern, как и в случае программы на Delphi,
указывает на то, что идентификатор процедуры является внешним. Перед
компиляцией программы на С + + необходимо добавить в проект объектный
файл с вызываемой процедурой. Лучше всего, если вы скопируете объектный
файл с процедурой в рабочий каталог проекта. Это замечание касается
как С + + .NET, так и Delphi 7.
И еще одно замечание. Компилятор Visual С++ работает с объектными
файлами в формате COFF (Common Object File Format — общий формат
объектных файлов), в отличие от Delphi, который использует файлы в стандарте
OMF (Object Module Format — формат объектных модулей). Поэтому
в процессе сборки вашего проекта в С + + .NET вы можете получить предупреждение
компоновщика:
Warning: converting object format from OMF to COFF
В принципе, это не так важно, поскольку компилятор С++ преобразует
OMF-файл в COFF в любом случае. Компилятор TASM, к сожалению, не
позволяет получать файлы формата COFF, а для MASM вы можете задать
ОПЦИЮ /colt'.
ml /с /coff Addlnts.asm
<< Назад В начало Далее >> |
|