Главная страница
    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.46 MB
Время: 0.008 c
2-1151248740
b.o.n.d.007
2006-06-25 19:19
2006.07.16
TChart


4-1144160259
AlexAlex
2006-04-04 18:17
2006.07.16
Можно ли защитить командную строку процесса ?


2-1151562868
простак
2006-06-29 10:34
2006.07.16
получение шестнадцатиричного значения символа в delphi и наоборот


15-1150014980
Карелин Артем
2006-06-11 12:36
2006.07.16
Лицензионные DVD.


15-1150338522
ВиндосМЕ
2006-06-15 06:28
2006.07.16
Firefox не будет работать на компьютерах с Windows 98/МЕ





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский