Организация ЭВМ и систем: Курс лекций (Позиционные системы счисления. Процессоры семейства IA-32. Лазерные принтеры), страница 61

                CALL    p1
                CALL    p2
                ADD     SP, 6

Многие ОС имеют особые соглашения для системных вызовов. Например, современные версии Microsoft Windows использует соглашение STDCALL. Здесь параметры передаются в стек в обратном порядке, как в C, но стек очищается вызываемой процедурой, как в PASCAL.

Кроме того, ряд компиляторов для языков программирования высокого уровня при оптимизации нарушают любые соглашения. Например, для передачи параметров используются регистры. Так при вызове функции с не менее, чем пятью параметрами, транслятор Watcom C первые четыре передаст через регистры общего назначения подходящего размера в порядке AX, DX, BX, CX, а пятый и последующие — через стек согласно соглашению C.

21.2.2. Возврат значения

Как правило, возвращаемое значение передаётся через регистры процессора. Целочисленное значение в зависимости от размера возвращается следующим образом:

Размер, байт

16-разрядный режим

32-разрядный режим

1

AL

AL

2

AX

AX

4

DX:AX

EAX

8

EDX:EAX

Значение с плавающей запятой возвращается через регистр ST(0).

21.3.  Преобразование имён

Трансляторы языков программирования высокого уровня преобразовывают названия процедур так, чтобы отразить используемый способ передачи параметров. Способ преобразования имён определяется:

—  операционной системой, для которой компилируется программа;

—  соглашением о передаче параметров;

—  индивидуальными особенностями разработчика компилятора.

Порядок преобразования имени процедуры p показан в следующей таблице.

Microsoft C

FreeBSD

Linux, Solaris

C

_p

_p

p

STDCALL

_p@a

Здесь a — суммарный размер области стека, занимаемой параметрами, то есть операнд команды RET, завершающей процедуру.

Следует также помнить, что ассемблеры по умолчанию преобразовывают все имена к верхнему регистру. Поэтому, если из ассемблерной программы нужно вызывать процедуру, которая была транслирована с именем, содержащим прописные буквы, то необходимо задать ассемблеру соответствующий параметр, который требует сохранить написание имён. Для транслятора MASM таким параметром является, например, ключи /Mx и /Ml.

22. От исходного текста к выполняющейся программе

22.1. Компиляция со статическим связыванием

22.2. Динамическое связывание

[5]

22.1.  Компиляция со статическим связыванием

Процесс преобразования исходного текста программы, написанного на том или ином языке программирования, в исполнимый модуль будем называть компиляцией.

Компиляция состоит, как правило, из двух разнородных этапов: трансляции и компоновки. На первом этапе, трансляции, происходит перевод отдельных модулей программы с исходного языка на машинный язык. Существенным является то, что каждый исходный модуль преобразовывается в отдельный объектный модуль. Причина такого подхода следующая: если бы все исходные модули ещё на этапе трансляции преобразовывались в единый исполнимый модуль, то при изменении одного оператора в исходном тексте необходимо было бы транслировать заново все модули, что может требовать больших ресурсов. Трансляция представляет собой переход на другой уровень. В DOS и Microsoft Windows объектные модули имеют расширение «obj», в ОС UNIX и Linux — «o». (Следует помнить, что в ОС типа UNIX собственно расширений нет, а есть просто точка и символы после неё в конце имени файла.)

При компоновке модулей перехода на другой уровень не происходит, поскольку текст на входе и выходе компоновщика предназначены для одной и той же виртуальной машины. Задача компоновщика — объединить независимо транслированные модули в единую программу.

В простейшем случае (и на первом шаге в более сложных случаях) компоновщик может просто разместить код различных объектных модулей последовательно один за другим.