Читайте также:
|
|
В связи с большим размером регистрового файла процессоров SHARC ADSP компилятор по возможности старается передавать параметры в функции через регистры. Через регистры в общем случае передаются три первых параметра, остальные передаются через стек. В стек параметры помещаются в порядке справа-налево (т.е. самым нижним должен оказаться аргумент, соответствующий самому правому параметру в описании функции).
Первый параметр, указанный в списке фактических параметров при вызове функции, передается через регистр r4, второй – через регистр r8, третий – через регистр r12. Остальные параметры передаются через стек. Из этого правила есть 2 исключения:
- если в подпрограмму передается параметр, занимающий больше 32-х битов, то он и все остальные параметры передаются через стек;
- если С++ – функция объявлена как принимающая переменное количество параметров (в прототипе функции имеется многоточие), то через стек передаются последний именованный параметр и все последующие.
Возврат результата в вызывающую функцию всегда выполняется через регистр. Если возвращаемое значение является 32-битовым (слово, адрес, структура длиной в 1 слово), то оно возвращается в регистре r0; если 64-битовым (например, тип long double или структура из двух слов), то в регистрах r0 (старшее слово) и r1 (младшее слово). Если результат имеет длину более 2‑х слов, то в регистре r1 возвращается адрес области памяти, где хранится результат.
Прототип функции | Передача параметров | Доступ к параметрам в функции |
pass(int a, float b, char c, float d); | a – r4 b – r8 c – r12 d – через стек | - - - dm(1, i6) |
count(int w, long double x, char y, float z) | w – r4 x – через стек y – через стек z – через стек | - dm(1, i6)–MSW(x), dm(2, i6)–LSW(x) dm(3, i6) dm(4, i6) |
compute(float k, int l, char m,…) | k – r4 l – r8 m и остальные – через стек | - - dm(1, i6) ... |
В приведенном ниже примере показан фрагмент кода, сгенерированного компилятором для вызова/возврата функции с двумя параметрами (и доступа к ним в теле функции).
Исходный код на языке С | Программный код на ассемблере для SHARC ADSP-2106x, сгенерированный компилятором |
int my_func(int, int); int arg_a, return_c; int my_func(int arg_1, int arg_2) { return (arg_1 + arg_2)/2; } main() { static int arg_b; arg_b = 0; return_c = my_func(arg_a, arg_b); } | /* Фрагмент функции main */ _main: ... r4=dm(_arg_a); /* r4 перв. аргумент */ r8=0; /* r8 втор. аргумент */ dm(arg_b)=r8; /* Вызов функции my_func */ cjump (pc,_my_func) (DB); dm(i7,m7)=r2; dm(i7,m7)=pc; /* Сохранение результата после возврата*/ dm(_return_c)=r0; ... /* C-функция my_func */ _my_func: r0=(r4+r8)/2; /* Возврат в main */ i12=dm(-1,i6); jump (m14, i12) (DB); nop; rframe; |
Взаимодействие подпрограмм на С и ассемблере
Дата добавления: 2015-11-16; просмотров: 61 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Регистры компилятора | | | Описания имен и области их видимости |