CALL p1
CALL p2
ADD SP, 6
Многие ОС имеют особые соглашения для системных вызовов. Например, современные версии Microsoft Windows использует соглашение STDCALL. Здесь параметры передаются в стек в обратном порядке, как в C, но стек очищается вызываемой процедурой, как в PASCAL.
Кроме того, ряд компиляторов для языков программирования высокого уровня при оптимизации нарушают любые соглашения. Например, для передачи параметров используются регистры. Так при вызове функции с не менее, чем пятью параметрами, транслятор Watcom C первые четыре передаст через регистры общего назначения подходящего размера в порядке AX, DX, BX, CX, а пятый и последующие — через стек согласно соглашению C.
Как правило, возвращаемое значение передаётся через регистры процессора. Целочисленное значение в зависимости от размера возвращается следующим образом:
Размер, байт |
16-разрядный режим |
32-разрядный режим |
1 |
AL |
AL |
2 |
AX |
AX |
4 |
DX:AX |
EAX |
8 |
— |
EDX:EAX |
Значение с плавающей запятой возвращается через регистр ST(0).
Трансляторы языков программирования высокого уровня преобразовывают названия процедур так, чтобы отразить используемый способ передачи параметров. Способ преобразования имён определяется:
— операционной системой, для которой компилируется программа;
— соглашением о передаче параметров;
— индивидуальными особенностями разработчика компилятора.
Порядок преобразования имени процедуры p показан в следующей таблице.
Microsoft C |
FreeBSD |
Linux, Solaris |
|
C |
_p |
_p |
p |
STDCALL |
_p@a |
Здесь a —
суммарный размер области стека, занимаемой параметрами, то есть операнд команды
RET
, завершающей процедуру.
Следует также помнить, что ассемблеры по умолчанию преобразовывают все имена к верхнему регистру. Поэтому, если из ассемблерной программы нужно вызывать процедуру, которая была транслирована с именем, содержащим прописные буквы, то необходимо задать ассемблеру соответствующий параметр, который требует сохранить написание имён. Для транслятора MASM таким параметром является, например, ключи /Mx и /Ml.
22.1. Компиляция со статическим связыванием
22.2. Динамическое связывание
[5]
Процесс преобразования исходного текста программы, написанного на том или ином языке программирования, в исполнимый модуль будем называть компиляцией.
Компиляция состоит, как правило, из двух разнородных этапов: трансляции и компоновки. На первом этапе, трансляции, происходит перевод отдельных модулей программы с исходного языка на машинный язык. Существенным является то, что каждый исходный модуль преобразовывается в отдельный объектный модуль. Причина такого подхода следующая: если бы все исходные модули ещё на этапе трансляции преобразовывались в единый исполнимый модуль, то при изменении одного оператора в исходном тексте необходимо было бы транслировать заново все модули, что может требовать больших ресурсов. Трансляция представляет собой переход на другой уровень. В DOS и Microsoft Windows объектные модули имеют расширение «obj», в ОС UNIX и Linux — «o». (Следует помнить, что в ОС типа UNIX собственно расширений нет, а есть просто точка и символы после неё в конце имени файла.)
При компоновке модулей перехода на другой уровень не происходит, поскольку текст на входе и выходе компоновщика предназначены для одной и той же виртуальной машины. Задача компоновщика — объединить независимо транслированные модули в единую программу.
В простейшем случае (и на первом шаге в более сложных случаях) компоновщик может просто разместить код различных объектных модулей последовательно один за другим.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.