Передача параметров в функции и возврат значений

В связи с большим размером регистрового файла процессоров 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) ...

Взаимодействие программ на С и ассемблере

Взаимодействие программ на С и ассемблере

В данном разделе рассмотрим примеры вызова подпрограмм на ассемблере из программы на С и наоборот.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: