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

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

Процедуры и функции [D7, XP]


Страницы:   1 2 3 4 5 6

Steep ©   (2006-12-19 16:12:00) 

Как я понял использование (изменение) параметров компонента в сабже запрещена.
Как этого можно избежать обойти?


Anatoly Podgoretsky   (2006-12-20 15:11:00) [21]

> Сергей М.  (20.12.2006 14:55:35)  [95]

А если резюмировать, то правила надо соблюдать.
На чем ты и настаивал, а что бы соблюдать надо использовать справку, читать книги, к чем у автора душа не лежит.


Anatoly Podgoretsky   (2006-12-20 15:10:00) [22]

> oxffff  (20.12.2006 14:48:34)  [94]

Да ну, ну так посмотри в CPU окне, что такое Result


Anatoly Podgoretsky   (2006-12-20 15:08:00) [23]

> oxffff  (20.12.2006 14:15:32)  [92]

Немного извиняюсь, не учел реальные типы, там действительно стек FPU
Остальное через EAX или прямо результат, или указатель, на память выделеную при вызове функции.
Упустил потому что про реальные числа особо речи не стояло.


Anatoly Podgoretsky   (2006-12-20 15:05:00) [24]

> Сергей М.  (20.12.2006 14:13:31)  [91]

Почему во множественном числе, в Виндоус по данному поводу одно соглашение и Борланд с этим согласен, а то как бы работали ДЛЛ


Anatoly Podgoretsky   (2006-12-20 15:04:00) [25]

> Steep  (20.12.2006 14:08:29)  [89]

> ато трафика она ест все больше и больше.....

Это твои проблемы и тебе их разрешать, нам размер не мешает


Сергей М.   (2006-12-20 14:55:00) [26]


> oxffff ©   (20.12.06 14:48) [94]



> Что и дальше будете на своем стоять, что calling conversion
> не имеет отношения


Уважаемый, ты что-то перепутал)

Оное утверждал АП (с), а не я)

Я-то как раз и затеял всю эту бодягу насчет соглашений и их важной связи с соотв.вопросом автора.


oxffff   (2006-12-20 14:48:00) [27]

Сергей М, вы что-то быстро сдались?

Вот пример

type
Mytype=record
a:array[1..10] of integer;
end;

.....

function abc:Mytype;stdcall;
begin
result.a[1]:=2;
end;

procedure TmainForm.Button5Click(Sender: TObject);
var a:Mytype;
begin
a:=abc;
showmessage(inttostr(a.a[1]));
end;

Возврат результата через скрытый var парамер.
Никаких вам EAX-EDX;

Что и дальше будете на своем стоять, что calling conversion не имеет отношения:
-ни к возврату из функций.
-ни к возвращаемому значению


Сергей М.   (2006-12-20 14:18:00) [28]


> oxffff ©   (20.12.06 14:15) [92]


> Я знаю что при safecall в eax "скрытый результат" выполнения
> вызова.


Ну и чудесно)
Значит повода для волнений нет.


oxffff   (2006-12-20 14:15:00) [29]


> Anatoly Podgoretsky ©   (20.12.06 14:01) [87]
> > Сергей М.  (20.12.2006 13:59:26)  [86]
>
> Результат всегда возвращается через [EDX]:EAX/AX/AL
> Спорить о том что находится в EAX бессмысленно.



> Сергей М. ©   (20.12.06 13:59) [86]
>
> > oxffff ©   (20.12.06 13:43) [84]
>
>
> Ты не прав.
>
> И в этом случае рез-т возвращается через eax.
> Только вот под результатом собственно вызова в соответствии
> с соглашением здесь подразумевается и ожидается иное.


The following conventions are used for returning function result values.

Ordinal results are returned, when possible, in a CPU register. Bytes are returned in AL, words are returned in AX, and double-words are returned in EAX.

Real results are returned in the floating-point coprocessor's top-of-stack register (ST(0)). For function results of type Currency, the value in ST(0) is scaled by 10000. For example, the Currency value 1.234 is returned in ST(0) as 12340.

For a string, dynamic array, method pointer, or variant result, the effects are the same as if the function result were declared as an additional var parameter following the declared parameters.
In other words, the caller passes an additional 32-bit pointer that points to a variable in which to return the function result.

Int64 is returned in EDX:EAX.
Pointer, class, class-reference, and procedure-pointer results are returned in EAX.

For static-array, record, and set results, if the value occupies one byte it is returned in AL;
if the value occupies two bytes it is returned in AX; and if the value occupies four bytes it is returned in EAX.
Otherwise, the result is returned in an additional var parameter that is passed to the function after the declared parameters.

И теперь вы тоже будете утвержать,что все через EAX-EDX.

Я знаю что при safecall в eax "скрытый результат" выполнения вызова.


Сергей М.   (2006-12-20 14:13:00) [30]


> Anatoly Podgoretsky ©   (20.12.06 14:01) [87]



> Результат всегда возвращается через [EDX]:EAX/AX/AL


Еще раз - это относится к стандартным широкоизвестным и общеупотребляемым соглашениям.
Для неких иных соглашений, если таковые имеются (а почему бы и нет ? мало ли в Бразилии узкоспециализированных языковых сред и компиляторов, не обязанных придерживаться этих правил !) это не указ.

Ну это так, к слову.
К проблеме автора действительно отношения не имеет - его касается именно [EDX]:EAX/AX/AL


> Спорить о том что находится в EAX бессмысленно.


Разумеется.


Anatoly Podgoretsky   (2006-12-20 14:08:00) [31]

> oxffff  (20.12.2006 14:06:28)  [88]

Почему потом, смотри вопрос автора в сообщение [63]


Steep   (2006-12-20 14:08:00) [32]

Еще раз всем спасибо!
PS пора закрывать эту тему, ато трафика она ест все больше и больше.....


oxffff   (2006-12-20 14:06:00) [33]


> Anatoly Podgoretsky ©   (20.12.06 13:46) [85]
> > oxffff  (20.12.2006 13:43:24)  [84]
>
> А при чем тут создание временных переменных.


Результат возвращается не в регистре.
А через стек (пусть даже косвенно).

Lea eax,[ebp-$08]
push eax
call abc
..
mov eax,[ebp-$08]

А очищать кто его должен?
Согласно Calling conventions.
Здесь результат возвращен через косвенно,но через стек.

Так что [75],[76],[77],[78] это не абсолютная истина.

Поэтому

утверждение

> При возврате из функций соглашение об вызове не используется.

Кстати почему это вы его в дальнейшем переформулировали на
возврат значений из функции?

Доказано. Сергей М мы победили.

:)


Anatoly Podgoretsky   (2006-12-20 14:01:00) [34]

> Сергей М.  (20.12.2006 13:59:26)  [86]

Результат всегда возвращается через [EDX]:EAX/AX/AL
Спорить о том что находится в EAX бессмысленно.


Сергей М.   (2006-12-20 13:59:00) [35]


> oxffff ©   (20.12.06 13:43) [84]


Ты не прав.

И в этомслучае рез-т возвращается через eax.
Только вот под результатом собственно вызова в соответствии с соглашением здесь подразумевается и ожидается иное.


Anatoly Podgoretsky   (2006-12-20 13:46:00) [36]

> oxffff  (20.12.2006 13:43:24)  [84]

А при чем тут создание временных переменных.


oxffff   (2006-12-20 13:43:00) [37]

Anatoly Podgoretsky ©   (20.12.06 13:33) [77]

>Значения не возвращаются через стек.

Вы все же торопитесь.
Вот вам пример  safecall;

function abc:integer;safecall;
begin
result:=5;
end;

procedure TmainForm.Button5Click(Sender: TObject);
begin
showmessage(inttostr(abc));
end;

Убедитесь, что создается временная переменная.


Сергей М.   (2006-12-20 13:41:00) [38]


> Anatoly Podgoretsky ©   (20.12.06 13:32) [75]


Да, тут D7
Но в общем случае таки [70]


Anatoly Podgoretsky   (2006-12-20 13:36:00) [39]

> Steep  (20.12.2006 13:31:14)  [74]

Нет


Anatoly Podgoretsky   (2006-12-20 13:35:00) [40]

> Steep  (20.12.2006 13:16:11)  [71]

> лучше смотреть в справке

Все остальное разговоры и не существенны, истины не имеют, а вот справка это сила.


Страницы:   1 2 3 4 5 6

Наверх

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