Страница 47 из 56
манду DW (резервировать слово), в то время как другие - DD (ре-
зервировать двойное слово), что определяет размер результирующего
указателя. Числовые и текстовые константы определяются как обыч-
но.
Переменные определяются так же, как константы. Если вы хоти-
те получить переменные, которые не инициализированы определенными
значениями, вы можете объявить их в _BSS-сегменте, поставив воп-
росительный знак (?) там, куда вы потом поместите переменные.
- 385,386 -
Определение глобальных и внешних идентификаторов
-----------------------------------------------------------------
Создание вами модуля не принесет большого успеха до тех пор,
пока ваша программа на Турбо Си не будет знать, какие функции она
может вызывать и на какие переменные может ссылаться. Кроме того,
вам может потребоваться возможность вызывать функции Турбо Си из
подпрограмм, написанных на ассемблере или ссылаться на перемен-
ные, объявленные в Турбо Си.
Чтобы освоить эти возможности, вам нужно разобраться в
трансляторе и компоновщике Турбо Си. Когда вы объявляете внешний
идентификатор, транслятор автоматически ставит перед ним знак
подчеркивания (_) до его сохранения в объектном модуле. Это озна-
чает, что вы должны поставить знак подчеркивания перед любым
идентификатором в вашем ассемблеровском модуле, к которому вы хо-
тите получить доступ из программы на Си. К Паскаль-идентификато-
рам обращение идет иначе, чем к идентификаторам Си, - они исполь-
зуют только верхний регистр и не снабжаются символом
подчеркивания.
Знак подчеркивания для идентификаторов Си необязателен, он
устанавливается по умолчанию(on). Он может быть отключен (off) с
помощью опции командной строки -u-. Однако, если вы используете
стандартные библиотеки Турбо Си, то столкнетесь с проблемами, ес-
ли только вы не переделали эти библиотеки. (Чтобы сделать это,
вам понадобится другой продукт Турбо Си - исходный текст программ
для библиотек поддержки; контактируйте с фирмой Borland
International для получения более подробной информации.)
Если любая asm-программа в исходном файле ссылается на любой
Си-идентификатор (данные или функции), то такие идентификаторы
должны начинаться со знака подчеркивания.
Турбо Ассемблер (TASM) не чувствителен к регистру, другими
словами, когда вы транслируете программу с языка ассемблера, то
все идентификаторы сохраняются только в заглавных символах. Ис-
пользование в TASM опции /mx переводит его в режим "чувствитель-
ности регистра" для внешних указателей. Компоновщик Турбо Си де-
лает то же самое с помощью идентификатора extern, т.о. эти
моменты хорошо совпадают. Вы можете заметить, что в наших приме-
рах ключевые слова и директивы записаны в верхнем регистре, а все
другие идентификаторы и коды команд - в нижнем (строчными симво-
лами); это совпадает со стилем, предлагаемым в руководстве по
- 387,388 -
TASM. Однако, вы вольны использовать все заглавные (или строчные)
или любые смешанные идентификаторы, как вам удобно.
Для того чтобы сделать идентификаторы (имена подпрограмм и
переменных) видимыми извне вашего ассемблерного модуля, вам нужно
объявить их как PUBLIC.
Так, например, если вы написали модуль, имеющий целые функ-
ции max и min и целые переменные MAXINT,lastmax и lastmin, вы
должны вставить в него оператор
PUBLIC _max,_min
в ваш программный сегмент, а операторы
PUBLIC _MAXINT, _lastmax, _lastmin
_MAXINT DW 32767
_lastmin DW 0
_lastmax DW 0
в сегмент данных.
Порядок вызова Турбо Си из .ASM
-----------------------------------------------------------------
Для того чтобы созданный вами модуль на ассемблере мог обра-
щаться к функциям и переменным, объявленным в программе на Турбо
Си, используйте оператор EXTRN.
Указатели на функции
-----------------------------------------------------------------
нужно использовать
размер наиболее часто встречающегося в структуре элемента.
Т.о., если ваша Си-программа имела глобальные переменные
int i, jarray [10];
char ch;
long result;
то вы можете сделать их доступными в вашем модуле с помощью сле-
дующего оператора:
EXTRN _i:WORD,_jarray:WORD,_ch:BYTE,_result:DWORD
И последнее важное замечание. Если вы используете модель па-
мяти huge, то операторы EXTRN должны появляться вне любого сег-
- 391,392 -
мента. Это применимо как к процедурам, так и к переменным.
Создание подпрограмм на ассемблере
-----------------------------------------------------------------
Теперь вы знаете, каким образом все должно быть определено,
и настало время ознакомиться, как вообще записываются функции на
ассемблере. Здесь необходимо рассмотреть несколько важных момен-
тов: передача параметров, возвращаемые значения и соглашения по
регистрам.
Предположим, вы хотите написать функцию min, которая, как вы
полагаете, имеет следующий прототип в Си:
int extern min(int v1, int v2);
Вы хотите, чтобы функция min вернула минимальную из двух пе-
реданных ей величин. В общем виде запись функции min будет: