Текущий архив: 2007.01.14;
Скачать: CL | DM;
Вниз
Процедуры и функции Найти похожие ветки
← →
Anatoly Podgoretsky © (2006-12-20 13:35) [80]> Сергей М. (20.12.2006 13:19:12) [72]
> Все равно "простым смертным", не читавшим справку, это не понять)
Согласен
← →
Anatoly Podgoretsky © (2006-12-20 13:35) [81]> Сергей М. (20.12.2006 13:21:13) [73]
Не привыкать
← →
Anatoly Podgoretsky © (2006-12-20 13:36) [82]> Steep (20.12.2006 13:31:14) [74]
Нет
← →
Сергей М. © (2006-12-20 13:41) [83]
> Anatoly Podgoretsky © (20.12.06 13:32) [75]
Да, тут D7
Но в общем случае таки [70]
← →
oxffff © (2006-12-20 13:43) [84]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;
Убедитесь, что создается временная переменная.
← →
Anatoly Podgoretsky © (2006-12-20 13:46) [85]> oxffff (20.12.2006 13:43:24) [84]
А при чем тут создание временных переменных.
← →
Сергей М. © (2006-12-20 13:59) [86]
> oxffff © (20.12.06 13:43) [84]
Ты не прав.
И в этом случае рез-т возвращается через eax.
Только вот под результатом собственно вызова в соответствии с соглашением здесь подразумевается и ожидается иное.
← →
Anatoly Podgoretsky © (2006-12-20 14:01) [87]> Сергей М. (20.12.2006 13:59:26) [86]
Результат всегда возвращается через [EDX]:EAX/AX/AL
Спорить о том что находится в EAX бессмысленно.
← →
oxffff © (2006-12-20 14:06) [88]
> 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] это не абсолютная истина.
Поэтому
утверждение
> При возврате из функций соглашение об вызове не используется.
Кстати почему это вы его в дальнейшем переформулировали на
возврат значений из функции?
Доказано. Сергей М мы победили.
:)
← →
Steep © (2006-12-20 14:08) [89]Еще раз всем спасибо!
PS пора закрывать эту тему, ато трафика она ест все больше и больше.....
← →
Anatoly Podgoretsky © (2006-12-20 14:08) [90]> oxffff (20.12.2006 14:06:28) [88]
Почему потом, смотри вопрос автора в сообщение [63]
← →
Сергей М. © (2006-12-20 14:13) [91]
> Anatoly Podgoretsky © (20.12.06 14:01) [87]
> Результат всегда возвращается через [EDX]:EAX/AX/AL
Еще раз - это относится к стандартным широкоизвестным и общеупотребляемым соглашениям.
Для неких иных соглашений, если таковые имеются (а почему бы и нет ? мало ли в Бразилии узкоспециализированных языковых сред и компиляторов, не обязанных придерживаться этих правил !) это не указ.
Ну это так, к слову.
К проблеме автора действительно отношения не имеет - его касается именно [EDX]:EAX/AX/AL
> Спорить о том что находится в EAX бессмысленно.
Разумеется.
← →
oxffff © (2006-12-20 14:15) [92]
> 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:18) [93]
> oxffff © (20.12.06 14:15) [92]
> Я знаю что при safecall в eax "скрытый результат" выполнения
> вызова.
Ну и чудесно)
Значит повода для волнений нет.
← →
oxffff © (2006-12-20 14:48) [94]Сергей М, вы что-то быстро сдались?
Вот пример
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:55) [95]
> oxffff © (20.12.06 14:48) [94]
> Что и дальше будете на своем стоять, что calling conversion
> не имеет отношения
Уважаемый, ты что-то перепутал)
Оное утверждал АП (с), а не я)
Я-то как раз и затеял всю эту бодягу насчет соглашений и их важной связи с соотв.вопросом автора.
← →
Anatoly Podgoretsky © (2006-12-20 15:04) [96]> Steep (20.12.2006 14:08:29) [89]
> ато трафика она ест все больше и больше.....
Это твои проблемы и тебе их разрешать, нам размер не мешает
← →
Anatoly Podgoretsky © (2006-12-20 15:05) [97]> Сергей М. (20.12.2006 14:13:31) [91]
Почему во множественном числе, в Виндоус по данному поводу одно соглашение и Борланд с этим согласен, а то как бы работали ДЛЛ
← →
Anatoly Podgoretsky © (2006-12-20 15:08) [98]> oxffff (20.12.2006 14:15:32) [92]
Немного извиняюсь, не учел реальные типы, там действительно стек FPU
Остальное через EAX или прямо результат, или указатель, на память выделеную при вызове функции.
Упустил потому что про реальные числа особо речи не стояло.
← →
Anatoly Podgoretsky © (2006-12-20 15:10) [99]> oxffff (20.12.2006 14:48:34) [94]
Да ну, ну так посмотри в CPU окне, что такое Result
← →
Anatoly Podgoretsky © (2006-12-20 15:11) [100]> Сергей М. (20.12.2006 14:55:35) [95]
А если резюмировать, то правила надо соблюдать.
На чем ты и настаивал, а что бы соблюдать надо использовать справку, читать книги, к чем у автора душа не лежит.
← →
Сергей М. © (2006-12-20 15:14) [101]
> Anatoly Podgoretsky © (20.12.06 15:05) [97]
> а то как бы работали ДЛЛ
Ну ты уже и ДЛЛ приплел) ... Они уж точно ни при чем.
Некий умба-юмба-компилятор сказал стандартному PE-линкеру, мол, на вот тебе некий отн.адрес и имя/ординал точки входа, запхай его в EAT, а остальное не твоя забота. Линкеру инф-ции вполне достаточно для "запихивания".
Давай уже не будем, а ?)
← →
Anatoly Podgoretsky © (2006-12-20 15:18) [102]При том, что они обязаны возвращать данные через указаные регистры, включая замечание по реальным числам.
← →
Сергей М. © (2006-12-20 15:24) [103]
> При том, что они обязаны возвращать данные через указаные
> регистры
С какого перепугу-то ?!
И хост-приложение и длл-модуль разработаны в среде умба-юмба.
Все соглашения, требуемые сист.загрузчиком РЕ-модулей, они соблюдают.
А дальше их дело, как друг-другу передавкать параметры вызовов и получать результаты - никого кроме них это не волнует.
← →
oxffff © (2006-12-20 15:32) [104]
> Anatoly Podgoretsky © (20.12.06 15:08) [98]
> > oxffff (20.12.2006 14:15:32) [92]
>
> Немного извиняюсь, не учел реальные типы, там действительно
> стек FPU
> Остальное через 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.
>Anatoly Podgoretsky © (20.12.06 15:10) [99]
> oxffff (20.12.2006 14:48:34) [94]
>Да ну, ну так посмотри в CPU окне, что такое Result
Result, это var параметр переданный через стек.
Вы опять не согласны?
Вы посмотрите под откладчиком на логику. Что и куда.
ЕAX там совсем не причем.
← →
Anatoly Podgoretsky © (2006-12-20 15:39) [105]> Сергей М. (20.12.2006 15:24:43) [103]
Ну если ты про умба-юмба, то обсуждай это на форуме умба-юмба
А здесь у нас Wintel и Дельфи
← →
Anatoly Podgoretsky © (2006-12-20 15:40) [106]> oxffff (20.12.2006 15:32:44) [104]
Этот дополнительный параметр называется Result и находится при возврате в EAX
← →
Anatoly Podgoretsky © (2006-12-20 15:42) [107]> Anatoly Podgoretsky (20.12.2006 15:40:46) [106]
Кстати у меня никаких проблем с возвратом, хоть из Паскаль функции, хоть из АСМ функции нет, ты это рассказывай автору, у меня проблем с этим нет, абсолютно никаких. Смогу вернуть и из Фортрана, и из Пролога.
← →
Anatoly Podgoretsky © (2006-12-20 15:43) [108]> oxffff (20.12.2006 14:06:28) [88]
Это чей код и что тут делает EAX?
mov eax,[ebp-$08]
← →
Anatoly Podgoretsky © (2006-12-20 15:44) [109]> oxffff (20.12.2006 14:06:28) [88]
> Доказано. Сергей М мы победили.
Тебя победа интересует?
А я думал другое, вот и ошибаешься в людях.
← →
Сергей М. © (2006-12-20 15:51) [110]
> Anatoly Podgoretsky © (20.12.06 15:39) [105]
Ну тогда и dll тут тоже всуе упомянут тобой)
В EAT прописаны всего лишь адреса точек входа, и ты это прекрасно знаешь. Ни о каких [EDX]:EAX/AX/AL там нет даже и намека - кто как хочет, тот так и получает возвращенные вызванной эксп.ф-цией результаты, на свой страх и риск)
← →
oxffff © (2006-12-20 16:11) [111]
> Anatoly Podgoretsky © (20.12.06 15:40) [106]
> > oxffff (20.12.2006 15:32:44) [104]
>
> Этот дополнительный параметр называется Result и находится
> при возврате в EAX
Вы опять торопитесь.
Не хотите посмотреть что внутри?
Перед вызовом
lea eax,[ebp-tmpVarOffset]
push eax
call abc
..
mov eax,[ebp-tmpVarOffset]
То что eax = ebp-tmpVarOffset после выхода не говорит о том, что это результат
Вот вам доказательство
function abc:mytype;stdcall;
var a,b,e,c,d:integer;
begin
result.a[1]:=2;
a:=5;
b:=6;
showmessage(inttostr(a*b));
end;
procedure TmainForm.Button5Click(Sender: TObject);
var a:Mytype;
begin
a:=abc;
// В ЕAX "Мусор"
showmessage(inttostr(a.a[1]));
end;
По выходу в еax совсем не то.
И что сейчас даже не согласитесь?
← →
oxffff © (2006-12-20 16:13) [112]
> Anatoly Podgoretsky © (20.12.06 15:40) [106]
> > oxffff (20.12.2006 15:32:44) [104]
>
> Этот дополнительный параметр называется Result и находится
> при возврате в EAX
Вы опять торопитесь.
Не хотите посмотреть что внутри?
Перед вызовом
lea eax,[ebp-tmpVarOffset]
push eax
call abc
..
mov eax,[ebp-tmpVarOffset]
То что eax = ebp-tmpVarOffset после выхода не говорит о том, что это результат
Вот вам доказательство
function abc:mytype;stdcall;
var a,b,e,c,d:integer;
begin
result.a[1]:=2;
a:=5;
b:=6;
showmessage(inttostr(a*b));
end;
procedure TmainForm.Button5Click(Sender: TObject);
var a:Mytype;
begin
a:=abc;
// В ЕAX "Мусор"
showmessage(inttostr(a.a[1]));
end;
По выходу в еax совсем не то.
И что сейчас даже не согласитесь?
← →
oxffff © (2006-12-20 16:15) [113]
> Anatoly Podgoretsky © (20.12.06 15:40) [106]
> > oxffff (20.12.2006 15:32:44) [104]
>
> Этот дополнительный параметр называется Result и находится
> при возврате в EAX
Вы опять торопитесь.
Не хотите посмотреть что внутри?
Перед вызовом
lea eax,[ebp-tmpVarOffset]
push eax
call abc
..
mov eax,[ebp-tmpVarOffset]
//Здесь в eax после возврата из abc, тоже что и перед вызовом abc, но это не результат
Вот вам доказательство
function abc:mytype;stdcall;
var a,b,e,c,d:integer;
begin
result.a[1]:=2;
a:=5;
b:=6;
showmessage(inttostr(a*b));
end;
procedure TmainForm.Button5Click(Sender: TObject);
var a:Mytype;
begin
a:=abc;
// В ЕAX "Мусор"
showmessage(inttostr(a.a[1]));
end;
По выходу в еax совсем не то.
И что сейчас не согласитесь?
← →
oxffff © (2006-12-20 19:07) [114]
> Anatoly Podgoretsky © (20.12.06 15:44) [109]
> > oxffff (20.12.2006 14:06:28) [88]
>
> > Доказано. Сергей М мы победили.
>
> Тебя победа интересует?
> А я думал другое, вот и ошибаешься в людях.
Да какая победа. :(
Живым бы выйти. :)
Вы прочитали [113]?
Вы все еще на своем настаиваете?
← →
Anatoly Podgoretsky © (2006-12-20 19:16) [115]> oxffff (20.12.2006 19:07:54) [114]
А я давно, гораздо раньше интерес потерял.
← →
SergP © (2006-12-20 19:19) [116]> [11] Anatoly Podgoretsky © (19.12.06 16:32)
> > SergP (19.12.2006 16:29:07) [7]
>
> > Оно не знает что такое Btn_OK
>
> Почему не знает, предположение/телепатия
телепатия...
Просто не стал объяснять "правильным языком", ибо долго писать, а человек и так поймет...
← →
oxffff © (2006-12-20 19:23) [117]
> Anatoly Podgoretsky © (20.12.06 19:16) [115]
> > oxffff (20.12.2006 19:07:54) [114]
>
> А я давно, гораздо раньше интерес потерял.
К чему?
← →
Anatoly Podgoretsky © (2006-12-20 19:25) [118]> oxffff (20.12.2006 19:23:57) [117]
К дисскуссии.
← →
oxffff © (2006-12-20 19:27) [119]
> Anatoly Podgoretsky © (20.12.06 19:25) [118]
> > oxffff (20.12.2006 19:23:57) [117]
>
> К дисскуссии.
Посмотрите [113],
я пошел жене ужин готовить. :)
Загляну позже.
← →
Anatoly Podgoretsky © (2006-12-20 19:32) [120]> oxffff (20.12.2006 19:27:59) [119]
Не вижу смысла возвращаться к старым сообщениям.
Мне бы кто приготовил.
Страницы: 1 2 3 вся ветка
Текущий архив: 2007.01.14;
Скачать: CL | DM;
Память: 0.71 MB
Время: 0.048 c