Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Параметры инлайновых функций


Автор: ТарасАтавин 6.9.2013, 06:53
Директива 
Код
inline
 означает встраивание тела функции по месту вместо её вызова. Соответственно инлайновые функции - это встраиваемые по месту использования функции. При наличии исходника такой функции проблемы нет, компилятор просто подставляет её текст и заменяет параметры, а уже потом генерит соотвествующий код. То есть 
Код
inline int summ(int a, int b)
{
 return a+b;
}
...
int x,y,z;
...
z=sum(x,y);
 до кодогенерации превращается в 
Код
inline int summ(int a, int b)
{
 return a+b;
}
...
int x,y,z;
...
z=x+y;
 и всёго делов. Но необходимо инлайновой сделать библиотечную писанную в опкодах не рекурсивную функцию с параметром. Как передавать параметры? Есть хоть какие то соглашения на этот счёт? Желательно, чтоб параметры-ссылки не были синтаксическими надстройками над указателями, но чтоб через них можно было возвращать данные. Может быть можно как то программно модифицировать код при встраивании и заменять адреса операндов?

Автор: _zorn_ 6.9.2013, 06:58
Цитата(ТарасАтавин @  6.9.2013,  14:53 Найти цитируемый пост)
Но необходимо инлайновой сделать библиотечную писанную в опкодах

Писец у тебя каша в голове.
Для чего сделать ? Почему просто не вызвать ?

Хватит уже конструировать лисапед с квадратными колёсами...

Автор: tzirechnoy 8.9.2013, 13:30
Никаких соглашэний на этот счёт нет. Так никто не делает в машынно-компилируемых языках как раз потому, что разработать в общем виде промежуточный формат библиотек, позволяющий столь высокий полиморфизм -- сложно.

Автор: ТарасАтавин 13.9.2013, 05:45
Ну ка где у меня хоть слово про полиморфизм?

Автор: ТарасАтавин 13.9.2013, 06:13
Цитата(tzirechnoy @  8.9.2013,  13:30 Найти цитируемый пост)
Так никто не делает в машынно-компилируемых языках как раз потому, что разработать в общем виде промежуточный формат библиотек.
Да кто говорит о едином подходе? Есть же паскалевое соглашение о вызовах, stdcall и другие. Мне просто надо хоть что то, что можно будет взять за соглашение о вызовах инлайновых функций с запретом рекурсии всего лишь для конкретного компилятора.

Добавлено через 12 минут и 8 секунд
А можно оттолкнуться от PE с одной исполняемой секцией на каждую функцию, их и встраивать и забазировать адреса операндов на какие нибудь 0x40000000h и при каждом встраивании искать их в коде встраиваемой секции и исправлять на правильные адреса фактических операндов? Как система находит адреса при перебазировании PE файла?

Автор: _zorn_ 13.9.2013, 06:28
Какое может быть соглашение о вызовах в инлайновых функциях ? Ты хоть их смысл понимаешь ? 
Инлайновая функция НЕ ВЫЗЫВАЕТСЯ, она встраивается. А какой код сгенерируется компилятором при встраивании совершенно не важно, главное чтобы регистры, используемые после ее "вызова" (встраивания) восстановил и стек выровнял.

Автор: ТарасАтавин 13.9.2013, 07:23
Цитата(_zorn_ @  13.9.2013,  06:28 Найти цитируемый пост)
Какое может быть соглашение о вызовах в инлайновых функциях ? Ты хоть их смысл понимаешь ? 
Понимаю. С точки зрения языка высокого уровня это вызов функции, а на низком уровне он заменяется встраиванием тела функции. Конечно, в данном случае говорить о соглашении именно о вызовах не корректно, так как в действительности вызов то как раз и исключается, я просто по привычке использовал максимально близкое известное мне понятие. Ну так как? Можно PE формат перебазировать при каждом встраивании? Или может лучше сочинить свой формат? С 64-х битными смещениями, секцией перечисления перебазирумых адресов и длинными именами секций вместо 8-ми байтных? Что будет проще: разобраться в PE, или сочинить что то своё?

Добавлено @ 07:36
Цитата(_zorn_ @  13.9.2013,  06:28 Найти цитируемый пост)
А какой код сгенерируется компилятором при встраивании совершенно не важно, главное чтобы регистры, используемые после ее "вызова" (встраивания) восстановил и стек выровнял. 
Важно. Код должен соответствовать задаче. Желательно всё таки не заворачивать во все ссылки по указателю, чтоб не притормаживать на косвенном доступе. Это остаётся на крайний случай: предать параметры в обратном через стек, через него же вернуть значение, а параметры ссылочных типов передать по адресам. В случае вызываемых функций другого способа реализовать изменяемые параметры нет, поэтому там в ссылки будут завёрнуты указатели. А для инлайновых желательно всё таки от этого избавиться, так как именно ради прямого обращения сразу к данным вызывающей подпрограммы инлайн и задуман.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)