В настоящее время большинство программистов предпочитают писать программы на языках высокого уровня. Но нет другого средства кроме ассемблера, которое позволило бы значительно оптимизировать часть написанной программы, с целью увеличения быстродействия и уменьшая используемой памяти.
Для этого может быть использовано две возможности. Первая это исключение нескольких операторов, написанных на языке высокого уровня, и замена их встроенным ассемблерным кодом, вставляемым внутрь программы на их место. Вторая – это замена отдельных программных единиц модулями, написанными на ассемблере.
Для организации межпрограммного взаимодействия существенными являются ограничения или соглашения, которые должны выполняться программными единицами, написанными на разных языках.
Соглашения об именах. Эти соглашения относятся к именам сегментов, модулей, переменных и процедур.
Внешние имена, которые получает редактор связей от компиляторов языков Бейсик, Паскаль, Фортран и Ассемблер преобразованы в идентификаторы, записанные прописными буквами. В тоже время, компиляторы С/С++ не изменяют регистра букв во внешних именах, но дополняют их лидирующим символом подчеркивания. Хотя ассемблер различает имена длиной до 31 символа, языки высокого уровня могут накладывать на это условие свои дополнительные ограничения.
Когда подпрограмма, написанная на ассемблере, объединяется с программами, написанными на языках высокого уровня, необходимо использовать имена сегментов, которые совместимы с вызывающей программой. Это особенно важно, когда между программными единицами передаются аргументы. Например, модель small языка С в компиляторе Borland C++ предполагает, что сегмент кода называется _TEXT, сегмент данных - _DATA, а сегмент не инициализированных данных - _BSS. Написанная на ассемблере подпрограмма должна использовать те же имена, чтобы обеспечить совместимость модулей.
Используемые модели памяти определяют, должны ли быть ссылки близкими (внутрисегментными) или далекими (межсегментными).
Компиляторы Borland и Microsoft поддерживают стандартные модели памяти. Large и medium модели требуют дальнего вызова для подпрограмм, когда в стек помещается полная адресная пара CS:IP, модели tiny, small и compact считают вызов подпрограмм близким, т.е. им достаточно поместить в стек только смещение. Поэтому для совместимости с языками высокого уровня лучше всего использовать директиву .model, в которой помимо модели памяти указан еще и тип языка: C, Pascal, Fortran или Basic
.model тип_памяти,тип_языка,
Модель flat используется для 32-разрядных приложений в защищенном режиме. Такие программы исполняются под управлением 32-разрядной операционной системы такой, как Windows 95, 98 или NT. В этом случае нет отдельных сегментов кода и данных. Все смещения и кода и данных являются 32-разрядными типа near. По умолчанию, например, все Win32 Console приложения, написанные на Microsoft Visual C++ используют эту модель.
Соглашения о вызовах (low-level protocol) определяют ограничения, накладываемые на устройство вызываемых подпрограмм:
· Содержимое каких регистров не должно быть испорчено в процессе выполнения подпрограммы;
· В каком порядке аргументы должны быть переданы в подпрограмму;
· Должны аргументы передаваться по значению или по ссылке;
· Как восстанавливается значение регистра указателя стека после вызова процедуры;
· Как функции возвращают значения в вызвавшую их программу.
Эти соглашения, как правило, различны для разных языков. Один лишь принцип является универсальным: передача аргументов производится через стек. Однако из из него существует исключение. Это протокол, который Microsoft называет __fastcall, когда четыре первых параметра передаются через регистры, и лишь остальные - через стек.
Передача аргументов может производиться:
· По значению, когда копия аргумента помещается в стек. Подпрограмма может работать с этой копией, но любые её изменения не повлияют на оригинал, копия которого была помещена в стек.
· По близкой ссылке, когда в стек помещается только смещение аргумента. Это дает подпрограмме доступ к переменной из вызывающей программы, являющейся аргументом. При этом предполагается, что и основная и вызываемая программные единицы работают с одним и тем же сегментом данных.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.