Студопедия
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

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

Читайте также:
  1. Cудeбныe функции князя и вeчe
  2. I. Правосознание: понятие, структура, функции и виды.
  3. I. Сущность, формы, функции исторического знания.
  4. II. Правовая культура: понятие, функции и виды.
  5. II. Функции Аппарата Правительства
  6. II. Функции школьной одежды
  7. II.2.2. Функции
  8. Int nod (int, int); - прототип нашей функции.
  9. Internet, его функции. Web-броузеры. Поиск информации в Internet.
  10. IV. Правотворчество: понятие, функции, виды. Стадии законотворческого процесса.

В течение вызова функции, вызываемая функция:

· передает параметры, или в регистрах или через стек

· помещает все остальные параметры в стек данных (CSTACK)

Управление передается вызываемой функции с адресом возврата, автоматически задвинутым в стек адреса возврата (RSTACK).

Вызываемаяфункция:

· сохраняет любых локальные регистры необходимые функции в стеке данных

· распределяет пространство для авто переменных и временных значений

· продолжает выполнять непосредственно саму функцию.

 

Регистровые параметры против параметров стека

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

Регистровые параметры

Для обоих соглашений о вызовах, регистраторы, доступные для проходящих параметров:

R16-R23

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

 

Параметр Выравнивание Используемые регистры
8-bit значение   R16, R17, R18, R19, R20, R21, R22, R23
16-bit значение   R17:R16, R19:R18, R21:R20, R23:R22
24-bit значение   R18:R17:R16, R22:R21:R20
32-bit значение   R19:R18:R17:R16, R23:R22:R21:R20

 

Назначение регистров, использующее старое соглашение о вызовах

В старом соглашении о вызовах, два крайних левых параметра передаются в регистрах, если они скалярные и до 32 битов в размере.

Следующая таблица показывает некоторых из возможных комбинаций:

Параметры Параметр 1 Параметр 2
f(b1,b2,…) R16 R20
f(b1,w2,…) R16 R20, R21
f(w1,l1,…) R16, R17 R20, R21, R22, R23
f(l1,b2,…) R16, R17, R18, R19 R20
f(l1,l2,…) R16, R17, R18, R19 R20, R21, R22, R23

 

Где b обозначает, 8-разрядный тип данных, w обозначает 16-разрядный тип данных, и l обозначает 32-разрядный тип данных. Если первый и – или второй параметр - 3-байтовый указатель, это будут пропускать в R16-R19 или R20-R22 соответственно.

Распределение регистров, использующее новое соглашение о вызовах

В новом соглашении о вызовах, максимальное число параметров передаются в регистрах. Остальные параметры передаются в стеке. Компилятор может изменять порядок параметров, чтобы достичь наиболее эффективного использования регистров.

Алгоритм для назначения параметров для регистраторов - довольно сложен в новом соглашении о вызовах.

Ниже следует несколько примеров комбинаций назначения регистра. Функция с описанием (не C++):

 

void foo(char __far * a, int b, char c, int d)

Будет распределено как: a – в R18:R17:R16, b – в R21:R20 (требование выравнивания предотвращает R20:R19), с – в R19 (метод первого подходящего), и d – в R23:R22 (метод первого подходящего).

Другойпример:

void bar(char a, int b, long c, char d)

Это привело бы к распределению: a – в R16 (метод первого подходящего), b – в R19:R18 (выравнивание), C – в R23:R22:R21:R20 (метод первого подходящего), и d – в R17 (метод первого подходящего).

И третийпример:

voidbaz(char a, char __far * b, int c, int d)

Это дало бы следующее распределение параметров: а – в R16, b – в R22:R21:R20, с – в R19:R18, и d – в стеке.

Параметры Стека

Имеется только ограниченное число регистров, которые могут использоваться для передачи параметров. Когда нет больше доступных регистров, параметры передаются в стеке.

Кроме того, параметры передаются в стеке в следующих случаях:

· Структурные типы: struct, union, и class если больше чем 4 байта

· тип данных double (64-разрядные числа с плавающей запятой)

· неименованные параметры для функций переменной длины, т.е. функции объявленные как
foo (param1,...), например printf(…).

 

Размещение Стека

Вызов Функции создает порядок расположения стека следующим образом:

 

Параметры Стека Любые параметры, которые не вошли в регистры.
Сохраняемые регистры R4-R15, R24-R27
Авто переменные Область для локальных переменных.
Временная память Любые временные значения.

 

Скрытые параметры

В дополнение к параметрам, видимым в функциональном объявлении и определении, также могут быть скрытые параметры:

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

· Для не static функций члена C++, этот указатель передается как первый параметр (но помещенный после возвращения указателя на структуру, если он один). Обратите внимание, что статические функции члена не имеют указателя this.




Дата добавления: 2014-12-19; просмотров: 224 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2026 год. (0.763 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав