Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микропроцессорная техника Сторожок / MPLAB_C30_Руководство пользователя.pdf
Скачиваний:
161
Добавлен:
20.02.2016
Размер:
1.26 Mб
Скачать

16-битовый компилятор Си. Руководство

4.11.Соглашения по вызову функций

При вызове функции:

Регистры W0-W7 сохраняются вызывающей функцией. Вызов функции должен спрятать их в стеке для сохранения значений.

Регистры W8-W14 сохраняются вызываемой функцией. Вызываемая функция должна сохранять любой из них, если его значение будет модифицировано.

Регистры W0-W4 используются для возврата результата функции.

ТАБЛИЦА 4-2. ПОТРЕБНОСТЬ В РЕГИСТРАХ

 

 

 

 

 

 

 

A

 

Тип данных

 

Количество требуемых.

регистров

 

 

 

 

char

1

 

 

int

1

Wilson

 

 

 

 

 

 

 

short

1

 

 

 

 

 

 

pointer

1

 

 

 

 

 

long

2

(смежные, начиная с регистра с четным номером)

 

 

 

float

2

(смежные, начиная с регистра с четным номером)

 

 

 

double(1)

2

(смежные, начиная с регистра с четным номером)

long double

4

(смежные, начиная с регистра с номером, кратным 4)

 

 

 

 

structure

1

регистр на 2 байта структуры

 

 

 

 

 

Примечание 1. Если используется опция -fno-short-double, то double эквивалентен long double.

Параметры размещаютсяbyв первых же доступных, выровненных и смежных

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

требуется. Структуры не имеют каких-либо ограничений по выравниванию;

4.11.1. Параметры функции

параметр-структура занимает регистры, если их достаточно для размещения структурыTranslatedцеликом. Результат функции сохраняется в последовательных регистрах, начинающие с W0.

Первые восемь регистров (W0-W7) используются для параметров функции. Параметры располагаются в регистрах в порядке слева направо, и параметр назначается первому доступному регистру с подходящим выравниванием.

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

ПРИМЕР 4-1. МОДЕЛЬ ВЫЗОВА ФУНКЦИИ

void

params0(short p0, long p1, int p2, char p3, float p4, void *p5)

{

/*

 

** W0

p0

** W1

p2

** W3:W2

p1

** W4

p3

** W5

p5

** W7:W6

p4

*/

 

...

}

DS51284H(ru) стр. 4-10

© 2008 Microchip Technology Inc.

Глава 4. Среда периода исполнения

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

ПРИМЕР 4-2. МОДЕЛЬ ВЫЗОВА ФУНКЦИИ, ПЕРЕДАЧА СТРУКТУРЫ

typedef struct bar {

int i; double d;

} bar;

void

A

.

params1(int i, bar b) {

Wilson

/*

 

** W0

 

** W1

b.i

** W5:W2

b.d

*/

 

...

 

}

 

Параметры, соответствующие пропущенным (ellipsis, ...), из списка аргументов переменной длины, не размещаются в регистрах. Любые параметры, не размещенные в регистрах, передаются через стек в порядке справа налево.

В следующем примере параметр-структура не может быть передан через регистры

из-за размера. Тем не менее, это не мешает следующему параметру использовать

долю регистров.

by

 

ПРИМЕР 4-3. МОДЕЛЬ ВЫЗОВА ФУНКЦИИ, ПЕРЕДАЧА АРГУМЕНТОВ ЧЕРЕЗ СТЕК

void

typedef struct bar {

 

double d,e;

 

} bar;

 

Translated** W1

j

params2(int i, bar b, int j) {

/*

 

 

** W0

i

**

stack

b

*/

...

}

Доступ к аргументам, переданным через стек, зависит от того, был или не был создан указатель фрейма. Обычно компилятор создает указатель фрейма (если нет противоположных команд) и переданные через стек параметры могут быть доступны посредством регистра указателя фрейма (W14). В вышеприведенном примере b будет доступен через W14–22. Смещение –22 относительно указателя фрейма вычислено (см. рис. 4-4) как –2 байта для предыдущего FP, –4 байта для адреса возврата и последующих 16 байтов для b.

© 2008 Microchip Technology Inc.

DS51284H(ru) стр. 4-11

Соседние файлы в папке Микропроцессорная техника Сторожок