Назад На главную Вперед

Взаимодействие программ и подпрограмм.


    Когда мы пишем свою программу, то почти всегда нуждаемся в помощи операционной системы или других программ. Это означает, что мы регулярно из своей программы обращаемся к другим программам и просим их что то сделать для нас: (например: прочитать данные с диска, вывести что то на экран, передать куда то какие то данные.)
    Программы, к которым мы обращаемся, должны знать, что им придется обрабатывать, то есть мы должны передавать им исходные данные для обработки. Как это происходит?
    Мы говорим ОС, что хотим использовать такую то функцию. Предполагается, что она доступна для использования. Эта функция должна знать, где находятся данные, которые она должна обработать. Функция сама обязана знать, где искать эти данные. Можно, например, перед ее вызовом  поместить исходные параметры в регистры процессора и функция во время своей работы ими воспользуется. Некоторые программы в Паскале так и поступают.
    Но наиболее универсальной считается передача параметров через стек. Это очень удобно. Когда мы вызываем функцию, то она уже прекрасно знает, что для нее в стеке припасено все что ей нужно. Важно только договориться: в каком порядке эти параметры в стек будут помещены.
     Например: сначала в стек поместят последний параметр для вызываемой функции, затем предпоследний и так далее до первого. Напомним на всякий случай: достаются из стека они обычно в обратном порядке. Таким образом функция сможет воспользоваться подготовленными для нее данными.
     Все бы казалось хорошо, но в стеке могут находиться данные и для других целей, а потому нужно решить, кто этой структурой будет управлять? Вот подпрограмма, которой мы передавали управление нам его вернула, выполнив все, что от нее требовалось. А что же стек? Наша программа вспоминает, что помещала туда что то. Вероятно, что там это все и осталось. И что со всем этим делать? Нашей программе эти данные уже не нужны. Отработанной программе тоже. А значит нужно вернуть стек в то состояние, в котором он находился до нашего запроса.
    Наша программа прекрасно осведомлена о том, что помещалось в стек, поэтому запросто может восстановить его исходное положение, или как говорят: выполнить его очистку. Но об этой ситуации также прекрасно осведомлена и вызываемая нами подпрограмма. Возникает вопрос: так кто же? В нашем случае постановили эту обязанность возложить на вызываемую подпрограмму, чтобы облегчить жизнь программистам, которые ее вызывают. И вправду, выполнила ты (подпрограмма), что тебе положено, так уж, будь добра, выполни очистку стека, ну что тебе стоит, ты же все помнишь о том, что для тебя готовили.
    А для исключения всяких недомолвок и сообщают о том, что в случае вызова подпрограмм наша программа будет закладывать для них параметры в стек именно так: справа налево, о об очистке стека должен позаботиться тот, кого вызывают. Вот, как много могут рассказать несколько символов: StdCall.
    В завершении нужно сказать:

- аббревиатура так и расшифровывается: стандартный вызов, но могут быть и другие способы.
- передача параметров через регистры, оказавшись незаслуженно забытой, в настоящее время используется все шире и шире. Главное - быстро и никаких проблем со стеком.
 


Другая информатика. (C) Публикация на draginf.ru. При использовании материалов ссылка на сайт обязательна.