- •Модульное программирование на ассемблере. Связь разноязыковых модулей
- •Введение
- •Модульное программирование на ассемблере
- •Процедура ассемблера. Описание процедуры
- •Связь процедур ассемблера по управлению
- •Организация передачи данных в процедурах на ассемблере
- •Передача параметров через регистры
- •Передача данных путем прямого обращения к памяти
- •Передача параметров в стеке
- •Передача параметров через таблицу адресов
- •Особенности реализации рекурсивных программ в ассемблере
- •Директивы описания процедур
- •Директива заголовка процедуры
- •Директива описания локальных переменных
- •Директива объявления прототипа процедуры
- •Директива вызова процедуры
- •Связь разноязыковых модулей в Windows
- •Основные правила организации связи разноязыковых модулей
- •Конвенции о связи модулей. Правила передачи параметров
- •Правила формирования внутренних имен подпрограмм и глобальных данных
- •Сохранение регистров и модель памяти
- •Основные принципы взаимодействия Delphi Pascal и ассемблера
- •Соглашения о передаче управления между модулями
- •Соответствие форматов данных
- •Передача параметров по значению и ссылке. Возврат результатов функций
- •Компоновка модулей
- •Примеры
- •Inc ecx ; адрес начала исходной строки
- •Основные принципы
- •Передача параметров и возвращение результатов функции
- •Определение глобальных и внешних имен
- •Компоновка модулей
- •Примеры
- •Правила формирования внутренних имен
- •Компоновка модулей
- •Примеры
Конвенции о связи модулей. Правила передачи параметров
Правила связи модулей получили название «конвенции». Поскольку первоначально основные правила передачи управления и параметров определялись языком программирования, названия основных конвенций связано с именами двух основных универсальных языков программирования: Паскаль и Си. Остальные получили свои имена в соответствии с основными свойствами: стандартная Windows, защищенная и регистровая.
Конвенция Паскаль предполагает, что параметры помещаются в стек в том порядке, в котором они встречаются в списке формальных параметров подпрограммы. Причем все параметры передаются через стек, регистры для передачи параметров не используются. Завершаясь, подпрограмма удаляет параметры из стека, а потом возвращает управление.
Конвенция Си предполагает обратный порядок помещения параметров в стек, регистры также не используются, и параметры из стека удаляет вызывающая программа.
Стандартная и Защищенные конвенции используют обратный порядок занесения параметров в стек, но очистку стека вызываемой процедурой. Эти конвенции очень похожи. Отличие только в том, что Защищенная конвенция формирует исключение при обнаружении ошибок, связанных с передачей параметров.
Регистровая конвенция означает передачу до трех параметров в регистрах. Обычно этого хватает, но если параметров больше, то остальные передаются через стек.
Конвенции реализованы в основных средах программирования (таблица 2.1).
Таблица 2.1 – Конвенции по передаче параметров
|
Конвенция
|
Delphi |
С++ Builder и Visual C++ |
Порядок параметров в стеке |
Очистка стека |
Использование регистров |
1
|
Паскаль |
pascal
|
_ _pascal
|
Слева направо |
Вызываемая процедура |
Нет |
2 |
Си |
cdecl |
_ _cdecl |
Справа налево |
Вызывающая программа |
Нет |
3 |
Стандартная |
stdcall |
_ _ stdcall |
Справа налево |
Вызываемая процедура |
Нет |
4 |
Защищенная |
savecall |
– |
Справа налево |
Вызываемая процедура |
Нет |
5 |
Регистровая |
register |
_ _fastcall |
Слева направо |
Вызываемая процедура |
Три регистра EAX, EDX, ECX, остальные параметры – в стеке |
Правила формирования внутренних имен подпрограмм и глобальных данных
Компилятор Delphi Pascal изменяет внутренние имена подпрограмм и глобальных переменных, заменяя строчные буквы на прописные. Это позволяет не учитывать регистр при записи программы на этом языке.
Компиляторы С изменяют имена всех глобальных переменных программы, добавляя перед ними символ подчеркивания «_». При этом строчные и прописные буквы в С различаются. Компиляторы С++ дописывают к именам функций специальные комбинации символов, отражающие используемый способ передачи параметров и их тип. В таблице 2.2 приведены основные особенности согласования имен в перечисленных средах.
Таблица 2.2 – Особенности формирования внутренних имен
|
Delphi Pascal |
Borland C++ |
Visual С++ |
Чувствительность к регистру клавиатуры |
Не различает строчных и прописных букв |
Различает строчные и прописные буквы |
Различает строчные и прописные буквы |
Преобразование внешних имен |
Преобразует все строчные буквы имен в прописные |
Помещает символ «_» перед внешними именами |
Помещает символ «_» перед внешними именами |
Преобразование имен подпрограмм |
Преобразует все строчные буквы имен в прописные |
Изменяет внутреннее имя подпрограммы: @<Имя>$q<описание параметров> |
Изменяет внутреннее имя подпрограммы: @_<имя>@<число параметров* 4> |
