Таблица
Возврат аргументов из процедуры на ассемблере в программу на C/C++
Тип возвращаемого значения (C++)
Unsigned char
Char
Место записи результата
АХ
АХ
Связь ассемблера с языками высокого уровня 363
Тип возвращаемого значения (C++)
Unsigned short
Short
Unsigned int
Unsigned long
Long
Указатель near
Указатель far
Место записи результата
AX
AX
AX
AX
AX
DX:AX
DX:AX
AX
DX:AX
Листинг
Вызывающий модуль на C/C++
extern int
count);
{
int
int len=5;
int sum;
;
;
}
Листинг
Вызываемая процедура на ассемблере
100h
public
proc С near
массива - в сх
mov
;адрес массива - в si
add
[si]
аккумулятора с элементом массива
add
следующий элемент массива
loop cycl
ret ;возврат из функции, результат - в ах
endp
end
Обратите внимание на то, что листинг 15.19 содержит текст исходного файла
с расширением .срр, а листинг 15.21 — с расширением
Соответственно, сами ис-
ходные тексты в части организации межмодульного взаимодействия также разли-
чаются.
Дополнительную информацию о связи
вы найдете в [18].
Несколько слов об организации связи
для компилятора Visual
C/C++. Один из подходов к ее реализации — оформление ассемблерной програм-
мы в виде функции из библиотеки DLL. В этом случае можно уйти от «фирмен-
ных» проблем связи, возникающих из-за несовпадения форматов информации
364 Глава
Модульное программирование
в объектных файлах Borland и Microsoft, и писать функции TASM и MASM для
связи с программами Visual C/C++. Разработка библиотек DLL для ассемблер-
ных программ описана в [8].
Таким образом, мы рассмотрели связь модулей на языках высокого уровня с мо-
дулями на ассемблере. Это обсуждение не могло быть полным из-за потенциаль-
ной глубины самой проблемы. Материал данного раздела можно рассматривать
лишь как введение (хотя и достаточно подробное) в проблему межъязыковых от-
ношений. Главная цель этого первого шага — разобраться с принципами. Следую-
щим шагом в направлении реализации связи с ассемблером будет изучение доку-
ментации на конкретный язык высокого уровня для выяснения особенностей
настройки и требований конкретной среды программирования.
Итоги
8 Язык ассемблера содержит довольно мощные средства поддержки модульного
подхода в рамках структурного программирования. В языке ассемблера эта тех-
нология поддерживается в основном с помощью механизма процедур и, час-
тично, механизма макроподстановок.
Л Гибкость интерфейса между процедурами достигается за счет разнообразия
вариантов передачи аргументов в процедуру и возвращения результатов. Для
этого могут использоваться регистры, общие области памяти, стек, директивы
EXTRN и PUBLIC.
и Компилятор MASM имеет мощное средство для работы с процедурами в виде
директив PROTO и INVOKE. Их использование существенно облегчает вызов про-
цедур и передачу в них параметров. Сочетание возможностей этих директив
с возможностями директивы PROC позволяет организовывать корректный и бо-
лее надежный вызов процедур, перекладывая заботу о формировании кодов
пролога и эпилога на транслятор.
9. Средства TASM поддерживают связи между языками. Ключевой момент при
этом — организация обмена данными. Обмен данными между процедурами на
языках высокого уровня и ассемблера производится через стек. Для доступа
к аргументам используются регистр ВР или (что более удобно) директива ARG.
Можно доверить компилятору самому формировать коды пролога и эпилога,
указав язык в директиве MODEL. Кроме того, указание языка позволяет задей-
ствовать символические имена аргументов, переданных процедуре в стеке, вме-
сто прямого использования регистра
для доступа к ним. Тем самым повыша-
ются мобильность разрабатываемых программ и устойчивость их к ошибкам.
* Для возвращения результата в программу на языке высокого уровня необходи-
мо использовать конкретные регистры. Через них можно передать как сами дан-
ные, так и указатели.
и Довольно эффективным для организации связи
может быть под-
ход, при котором ассемблерный код оформляется в виде функций библиотек
DLL.
Do'stlaringiz bilan baham: |