Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по МО.doc
Скачиваний:
47
Добавлен:
01.06.2015
Размер:
353.79 Кб
Скачать

Трансляция и компоновка

Для подключения внешней ассемблерной подпрограммы к про­грамме на Pascal следует:

оттранслировать ассемблерную программу и получить ОМ;

в программе на Pascal описать внешнюю подпрограмму procedure имя( параметры ); external;

в программу на Pascal с помощью команды {$L имяОМ } вклю­чить ОМ.

2.5. Соглашение о связях языка 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 в струк­туре преобразованию не подвергаются.

Трансляция и компоновка

Модели памяти взаимодействующих подпрограмм должны быть согласованы. Этого можно достигнуть, либо установив одинаковые модели для C-компилятора (команда Options+Compiler+ Code generation) и ассемблера (директива model), либо указав явно модификаторы подпрограмм и параметров-указателей (атрибуты near или far).

Компоновка может быть выполнена в интегрированной среде Borland C++. В этом случае следует использовать файл проекта, в который включить ОМ или ИМ ассемблерной ПП. В первом слу­чае потребуется только настройка компоновщика, во втором – и ас­семблера.

При настройке компоновщика с помощью команды Options+Linker+Settings следует обязательно включить режим Case-sensitive link (различение прописных и строчных букв).

При настройке ассемблера с помощью команды Options+Transfer следует в список Program Titles внести ассемблер (он там наверняка уже будет) и правильно задать для него путь доступа (Program Path) и командную строку (Command Line), которая может выгля­деть так – /MX /ZI $TASM. Здесь ключи задают, соответственно, для глобальных имен различать строчные и прописные буквы и вклю­чать полную отладочную информацию. Параметр $TASM обязате­лен.

Допустимо использование для компоновки непосредственно компоновщика TLINK, в этом случае в командной строке обяза­тельно следует задать ключ различения строчных и прописных букв в именах – /c.