Содержание материала

Может кто объяснит подробнее особенности применения директив вызовов процедур: register, pascal, cdecl, stdcall, safecall.
В чём отличия, когда и какие надо применять, какие преимущества и недостатки?

 

Разница в способе передачи параметров в функцию и возврата параметров из функции.

stdcall - юзается (вроде) а винапях. Передача аргументов справа налево. Стек очищает вызываемая процедура. Возвращает разультат в EAX (помойму)

pascal - юзалось в вин16апи. Передача в аргументов слева направо. Стек очищает вызываемая. В паскале результат возвращался в al, ax или в dx:ax. Как в Дельфи - не помню, вероятно а EAX.

register - передача всего через регистры процессора. Как именно - зависит от компилятора.

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

 

 


 

sdecl - вызовы в стиле С (для обращения к DLL использующим соглашения о вызовах в стиле С). Параметры в сет с права на лево. Очистка - вызывающей процедурой. Обеспечивают обслуживание переменного числа параметров.

 

Автор ответа:Dapo

 

Взято с Vingrad


 

Эти директивы скорее относятся к способу(ам) реализации вызовов процедур и передачи (приему от) параметров на конкретном машинном языке при компиляции с языков высокого уровня.

Так, например в DOS СИ использовали свои виды реализаций(обычно называемые C-call), а Паскаль - свой. В win32 также различаются реализации для этих языков, но постепенно происходит заимствование фрагментов реализаций друг у друга и их симбиозы (stdcall).

Если ты пишешь только на одном языке и не подключаешь внешних библиотек, созданных другим компилятором (в другом формате), то тебе, в принципе, все равно, какая реализация используется - компилятор сам примет верное решение и согласует вызовы подпрограмм в своем стиле. Исключение, пожалуй, составляет лишь опция "registers" - по смыслу это означает приоритетное использование регистров процессора для передачи(получения) данных процедуре. Как правило, это ускоряет вызов процедуры и возврат из нее: может быть использования для повышения быстродействия. Однако это обычно делают установкой глобального флага проекта в момент создания Файнал Релиз, применяя это сразу ко всем подпрограммам.

Однако если тебе необходимо подключить внешнюю библиотеку (например, написанный на СИ dll, вызывающий в свою очередь апи sql-сервера), то будет необходимо учесть способ передачи параметров именно этой библиотеке.

Или при явном вызове win api из кода также нужно учесть способ их вызова (stdcall)...

 

 

Автор ответа:Chingachguk

 

Взято с Vingrad

 


 

 

Calling conventions influence two things:

· how parameters are passed to a function/procedure (=routines)
· how the call stack is cleaned up when the call returns

Delphi routines can use the calling conventions pascal (the Delphi 1 default), register (the default for Delphi 2-5), cdecl (the default used by C/C++ compilers), stdcall (the default used by the Windows API). There is a fifth one: safecall, which is only used in the context of interface methods. A good explanation for what it entails can be found in issue 51 (Nov. 99) of The Delphi Magazine, i will not go into it further here. Lets go through the first four in detail, using a couple of test functions with the same parameter list but different calling conventions. For clearity we compile with stack frames on, so each routine will start with the prologue push ebp mov ebp, esp. The stack layouts given below are for the mov line. Each test function is called with the same parameter values so one can

use the CPU windows stack pane to study the resulting stack layout.

 

1. Pascal calling convention

Code:

Function Test1( i: Integer; b: Boolean; d: Double ): Integer; Pascal;

 

Pascal calling convention passes parameters on the stack and pushes them from left to right in the parameter list. Each parameter occupies a multiple of 4 bytes. The resulting stack layout is

 

ebp + 20 value of i, 4 bytes

ebp + 16 value of b, 4 bytes, only lowbyte significant

ebp + 08 value of d, 8 bytes

ebp + 04 return address, 4 bytes

ebp + 00 old ebp value

 

The parameters are cleared off the stack by the called function using a ret $10 instruction ($10 = 16 is the total size of the parameters on stack).

 

2. Register calling convention

Code:

Function Test2( i: Integer; b: Boolean; d: Double ): Integer; Register;

 

Register calling convention passes parameters in registers eax, edx, ecx and on the stack and processes them from left to right in the parameter list. There are rules to decide what goes into registers and what goes on the stack, as detailed in the Object Pascal Language guide. The resulting stack layout is

 

ebp + 08 value of d, 8 bytes

ebp + 04 return address, 4 bytes

ebp + 00 old ebp value

 

The value of i is passed in eax, the value of b in edx. The parameters are cleared off the stack by the called function using a ret $8 instruction ($8 = 8 is the total size of the parameters on stack).

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить