![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача параметров 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]
> если известен адрес функции, количество параметров и их
> типы?
Ну и, само-собой, значения самих параметров.