Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
12. Модульное программирование на ассемблере. С...doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
947 Кб
Скачать
☆
    1. Конвенции о связи модулей. Правила передачи параметров

Правила связи модулей получили название «конвенции». Поскольку первоначально основные правила передачи управления и параметров определялись языком программирования, названия основных конвенций связано с именами двух основных универсальных языков программирования: Паскаль и Си. Остальные получили свои имена в соответствии с основными свойствами: стандартная 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, остальные параметры – в стеке

    1. Правила формирования внутренних имен подпрограмм и глобальных данных

Компилятор Delphi Pascal изменяет внутренние имена подпрограмм и глобальных переменных, заменяя строчные буквы на прописные. Это позволяет не учитывать регистр при записи программы на этом языке.

Компиляторы С изменяют имена всех глобальных переменных программы, добавляя перед ними символ подчеркивания «_». При этом строчные и прописные буквы в С различаются. Компиляторы С++ дописывают к именам функций специальные комбинации символов, отражающие используемый способ передачи параметров и их тип. В таблице 2.2 приведены основные особенности согласования имен в перечисленных средах.

Таблица 2.2 – Особенности формирования внутренних имен

Delphi Pascal

Borland C++

Visual С++

Чувствительность к регистру

клавиатуры

Не различает строчных и

прописных букв

Различает строчные и прописные буквы

Различает строчные и прописные буквы

Преобразование внешних имен

Преобразует все строчные буквы имен в прописные

Помещает символ «_»

перед внешними

именами

Помещает символ «_»

перед внешними

именами

Преобразование имен

подпрограмм

Преобразует все строчные буквы имен в прописные

Изменяет внутреннее имя подпрограммы:

@<Имя>$q<описание параметров>

Изменяет внутреннее имя подпрограммы:

@_<имя>@<число

параметров* 4>