Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передача параметров asm, Delphi. [D7, WinXP]


boalse ©   (2006-06-02 11:38:00) 

По правилам параметры для функции передаются следующим образом:
Первый в eax, второй в edx, третий в ecx, все остальные - в стек. Интересует, всегда ли эти правила выполняются для функций в библиотеках dll?
Допустим, я знаю адрес некой функции, загруженной из некой длл, знаю количество параметров, знаю типы параметров. Всё это мне указал пользователь, т.е. известно мне это всё становится в ран-тайме. Могу ли я быть уверен в том, что передавая функции эти параметры по правилам, указанным выше, функция их все примет? Или возможны исключения из правил? Если так, то как тогда делфи при компиляции программы, узнаёт в какой регистр процессора для конкретной функции передавать конкретный параметр?

Иными словами, как (по каким правилам) для любой функции из любой длл передать 100% правильно все необходимые ей параметры, если известен адрес функции, количество параметров и их типы?

Всегда ли результат (или ссылка на результат) функции записывается в eax?


boalse   (2006-06-02 14:31:00) [1]

Понятно, спасибо.


Чапаев   (2006-06-02 13:09:00) [2]


> F(A1,A2,A3) stdcall    
> Это значит, что функция примет сначала A3, потом A2, потом
> A1?
> А если
> F(A1,A2,A3) pascal
> , то наоборот?

Нет. Не "функция примет", а на вершине стека в первом случае будет лежать А1, а во втором -- А3.


Чапаев   (2006-06-02 13:07:00) [3]


> Что означает Clean-up: Caller, Routine?

Очищает ли стек тот, кто вызвал подпрограмму, или сама подпрограмма.

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


boalse   (2006-06-02 13:01:00) [4]

F(A1,A2,A3) stdcall    
Это значит, что функция примет сначала A3, потом A2, потом A1?
А если
F(A1,A2,A3) pascal
, то наоборот?


boalse   (2006-06-02 12:58:00) [5]

так stdcall и т.п. это и есть правила по которым передаются параметры?
А я то думаю, что это за фигня такая...

Большое спасибо!

Ещё парочка дурацких вопросов:
Что означает Clean-up: Caller, Routine?
Если Passes parameters in registers=Yes, то правила такие, как написал я в [0]?


han_malign   (2006-06-02 12:08:00) [6]

Calling conventions
Directive   Parameter order     Clean-up  Passes parameters in registers?
register    Left-to-right       Routine   Yes
pascal      Left-to-right       Routine   No
cdecl       Right-to-left       Caller    No
stdcall     Right-to-left       Routine   No
safecall    Right-to-left       Routine   No


han_malign   (2006-06-02 12:05:00) [7]


> в библиотеках dll

- обычно используется соглашение вызовов stdcall или cdecl, в которых ВСЕ параметры передаются через стек, причем, в зависимости от соглашения, в разном порядке...


boalse   (2006-06-02 11:40:00) [8]


> если известен адрес функции, количество параметров и их
> типы?

Ну и, само-собой, значения самих параметров.


Наверх

Титульная страница Поиск, карта сайта Написать письмо