В связи с большим размером регистрового файла процессоров SHARC компилятор по возможности старается передавать параметры в функции через регистры. При этом через регистры в общем случае передаются три первых параметра, остальные передаются через стек. В стек параметры помещаются в направлении справа-налево (т.е. самым нижним должен оказаться аргумент, соответствующий самому правому параметру в описании функции).
Первый параметр, указанный в списке фактических параметров пир вызове функции, передается через регистр 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) ... |
Взаимодействие программ на С и ассемблере
Взаимодействие программ на С и ассемблере
В данном разделе рассмотрим примеры вызова подпрограмм на ассемблере из программы на С и наоборот.