Для подключения внешней ассемблерной подпрограммы к программе на Pascal следует:
оттранслировать ассемблерную программу и получить ОМ;
в программе на Pascal описать внешнюю подпрограмму
procedure имя(параметры); external;
в программу на Pascal с помощью команды {$L имяОМ } включить ОМ.
Соглашение о связях языка C (сводка)
Преобразование имен
Значащая длина идентификатора может быть от 8 до 250 символов, умолчание – 32. Для изменения служит команда Options+Compiler+Source.
Прописные и строчные буквы различаются.
В начало каждого имени включается символ подчеркивания, отменить это можно с помощью команды Options+Compiler+Advanced code generation.
Передача и возврат управления
Тип подпрограмм (near или far) и, следовательно, команд call и ret зависит от используемой модели памяти. Установка модели памяти осуществляется командой Options+Compiler+Code generation. Подробнее о моделях памяти см. лабораторную работу «Использование подпрограмм» настоящего сборника или документацию по СП.
Передача и возврат данных
Параметры передаются в стеке. Помещаются они в стек в порядке, обратном порядку записи в тексте программы, т.е. первый в тексте будет на самом верху стека.
Скалярные типы данных передаются по значению, массивы – по ссылке. Размер указателя (near или far) зависит от используемой модели памяти.
Скалярные и структурные данные, помещающиеся в байт, возвращаются в AL, помещающиеся в слово – в AX, помещающиеся в двойное слово – в паре DX:AX. Табл. 5 поясняет соответствие типов возвращаемых данных языка C и регистров процессора.
Таблица 5
Тип функции | Регистр(ы) |
char | AL |
short, int | AX |
long | DX – старшее слово, AX – младшее |
near * | AX – смещение |
far * | DX – сегмент, AX – смещение |
Многомерные массивы располагаются в памяти таким образом, что быстрее изменяется последний индекс.
При определении размеров структур и доступа к ним необходимо учитывать возможность выравнивания полей структур на границу слова (команда Options+Compiler+Advanced code generation).
Преобразование данных
При вызове подпрограммы скалярные данные типа float всегда преобразовываются в данные типа double. Поля типа float в структуре преобразованию не подвергаются.