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

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


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


 
 
 

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