👾21. Функции, связь с математическими функциями. Инструкция return. Вызов функции.

Объявление и определение функции. Кадр стека, назначение, что в нем содержится

Функция — это самостоятельная единица программы, которая спроектирована для реализации конкретной подзадачи.

Оператор возврата return

Является завершающим оператором программы. Состоит из ключевого слова return, за котором следует возвращаемое значение (тип данных которого соответствует возвращаемому типу функции, указанному в заголовке) и точка с запятой.

Работа с функциями

Объявление функции (прототип):

<тип возвращаемого значения> имя_функции (<тип аргумента> имя_аргумента)int function (char *, int) имя аргумента не обязательно

Определение функции:

<тип возвращаемого значения> имя_функции (<тип аргумента> имя_аргумента){Тело функции}​int function (char *s, int n){n = strlen(s);printf(“Длина: %d”, n);return n;}

Вызов функции:

имя_функции (имя_аргумента)function (s, n);

Кадр стека

Как только мы вызываем функцию, в стеке для неё создается стековый кадр, который содержит локальные переменные, а также аргументы, которые были переданы вызывающей функцией. На выходе из функции стековый кадр очищается.

Сегмент стека

  • Процессор выполняет каждую функцию как отдельную задачу. Для обмена данными между функциями используется специально выделяемая область памяти называемая сегментом стека.

  • Запись и чтение данных в стек осуществляется в соответствии с принципом LIFO (Last In First Out — “последним пришел, первым ушел”). У процессора есть регистр SS (сегмент стека), который содержит адрес этой области памяти. Сегмент стека заполняется начиная со старших адресов к младшим. Вызывающая функция передает данные вызываемой через список параметров и они записываются в сегмент стека начиная с последнего параметра. Таким образом первый параметр оказывается в вершине стека (имеет самый младший адрес).

  • Адрес вершины стека хранится в регистре SP (stack pointer, указатель стека) и вызываемая функция по этому адресу получает доступ к переданным ей данным. Вызываемая функция работает с копиями данных вызывающей функции. Поэтому изменение данных вызываемой функцией не приводит к изменению данных вызывающей (происходит передача данных по значению). Вызываемая функция возвращает результат работы используя инструкцию return.

Last updated