Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.16;
Скачать: CL | DM;

Вниз

Передача параметров asm, Delphi.   Найти похожие ветки 

 
boalse ©   (2006-06-02 11:38) [0]

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

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

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


 
boalse ©   (2006-06-02 11:40) [1]


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

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


 
han_malign ©   (2006-06-02 12:05) [2]


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

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


 
han_malign ©   (2006-06-02 12:08) [3]

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


 
boalse ©   (2006-06-02 12:58) [4]

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

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

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


 
boalse ©   (2006-06-02 13:01) [5]

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


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


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

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

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


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


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

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


 
boalse ©   (2006-06-02 14:31) [8]

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



Страницы: 1 вся ветка

Текущий архив: 2006.07.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.032 c
15-1150439189
Kerk
2006-06-16 10:26
2006.07.16
Придумайте мне русский синоним слова online


3-1147685034
Sorcerer
2006-05-15 13:23
2006.07.16
Использование ADO


2-1151236718
Gizza
2006-06-25 15:58
2006.07.16
Запуск файла


2-1151658410
0bsid
2006-06-30 13:06
2006.07.16
Подскажите, как выдрать надпись из чужой программы?


2-1151509239
olevacho_
2006-06-28 19:40
2006.07.16
Защита привязкой к компу