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

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

Супер эффект с showmessage. [D7]


Страницы:   1 2

oxffff ©   (2007-07-26 11:33:00) 

procedure TForm1.Button1Click(Sender: TObject);
var a,b:integer;
begin
asm
sub esp,2;
end;
showmessage(inttostr(b));
showmessage(inttostr(a));
asm
add esp,2;
end;
end;

Что это за эффект?
Причем разный под отладчиком и без него.


oxffff   (2007-07-26 15:02:00) [1]

Sorry не туда.


oxffff   (2007-07-26 15:01:00) [2]

Здесь сообщение о недочете.
http://qc.codegear.com/wc/qcmain.aspx?d=49593


oxffff   (2007-07-26 14:58:00) [3]


> SlymRO ©   (26.07.07 14:19) [18]
> EBP - не стек...
> ESP - стек...
> мало ты его изменил ты еще его и некратным integer сделал.
> ..
>
> пытался сделать call функции и подсунуть ей свой фрейм стека,
>  чтоб повторно инфу в стек не загонять, она ведь уже там,
>  но не тут-то было вызываемая функция так над стеком прорабатала,
>  что затерла адрес возврата для ret... таки пришлось повторно
> в стек пихать инфу


Ты что-то не понял. Перечитай еще раз.


Lacmus   (2007-07-26 14:52:00) [4]

>Сергей М. ©   (26.07.07 14:41) [20]

Спасибо, я это прочитал, хотя текста действительно много :-)


Сергей М.   (2007-07-26 14:41:00) [5]


> Lacmus ©   (26.07.07 12:52) [16]


Цитата из http://www.insidepro.com/kk/107/107r.shtml:

Многие API-функции неявно закладываются на выравнивание стека и если нам, к примеру, требуется ровно 69h байт стековой памяти, ни в коем случае нельзя писать SUB ESP,69h, иначе все рухнет! Следует округлить 69h по границе двойного слова и запросить 6Ch байт или... между актами выделения/освобождения памяти не вызывать никаких API-функций


SlymRO   (2007-07-26 14:33:00) [6]

Register use

In general, the rules of register use in an asm statement are the same as those of an external procedure or function. An asm statement must preserve the EDI, ESI, ESP, EBP, and EBXregisters, but can freely modify the EAX, ECX, and EDX registers. On entry to an asm statement, EBP points to the current stack frame and ESP points to the top of the stack. Except for ESP and EBP, an asm statement can assume nothing about register contents on entry to the statement.


SlymRO   (2007-07-26 14:19:00) [7]

EBP - не стек...
ESP - стек...
мало ты его изменил ты еще его и некратным integer сделал...

пытался сделать call функции и подсунуть ей свой фрейм стека, чтоб повторно инфу в стек не загонять, она ведь уже там, но не тут-то было вызываемая функция так над стеком прорабатала, что затерла адрес возврата для ret... таки пришлось повторно в стек пихать инфу


oxffff   (2007-07-26 13:13:00) [8]

http://www.insidepro.com/kk/107/107r.shtml

Аналогия с 64 битной
blogs.msdn.com/58579.aspx
http://www.microsoft.com/rus/msdn/magazine/2006/05/pietrek_x64.mspx


Lacmus   (2007-07-26 12:52:00) [9]

>Сергей М. ©   (26.07.07 11:39) [3]
>oxffff ©   (26.07.07 12:40) [15]

(Просто интересно)

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


oxffff   (2007-07-26 12:40:00) [10]


> Lacmus ©   (26.07.07 12:32) [14]


Ответ прозвучал в [3].
Win32 так требует.


Lacmus   (2007-07-26 12:32:00) [11]



function CreateMessageDialog(const Msg: string; DlgType: TMsgDlgType;
 Buttons: TMsgDlgButtons; DefaultButton: TMsgDlgBtn): TForm;
...
DrawText(Canvas.Handle, PChar(Msg), Length(Msg)+1, TextRect,
     DT_EXPANDTABS or DT_CALCRECT or DT_WORDBREAK or
     DrawTextBiDiModeFlagsReadingOnly);
...

Вернул TextRect (0, 0, 53, 1441792, (0, 0), (53, 1441792)), хотя Msg правильный, видимо проблема там


oxffff   (2007-07-26 12:14:00) [12]


> Сергей М. ©   (26.07.07 12:10) [12]
>
> > Почему проявляется данный эффект?
>
>
> Потому что [3]
>
> Делфи здесь ни причем.


Я уже понял. Благодарю. Буду знать.


Сергей М.   (2007-07-26 12:10:00) [13]


> Почему проявляется данный эффект?


Потому что [3]

Делфи здесь ни причем.


oxffff   (2007-07-26 12:01:00) [14]


> Сергей М. ©   (26.07.07 11:53) [8]
>
> > окно ведет себя странно
>
>
> Открою тебе страшную тайну - ShowMessage здесь ни при чем,
>  еще интересней "эффект" выглядит при MessageBox.


Я так надеялся. Но это не тайна. :)
Только это CreateMessageDialog.

Почему проявляется данный эффект?


oxffff   (2007-07-26 11:56:00) [15]


> Lacmus ©   (26.07.07 11:52) [7]
> >oxffff ©   (26.07.07 11:43) [5]
> Указатель на результат IntToStr сохраняется в стеке, в данном
> случае он будет неправильный (строка произвольной длины)


Я же написал, что не трогаю ebp.
Вот код вызова inttostr

lea edx,[ebp-$] result
mov eax,[ebp-$] int
call inttostr

Таким образом все на своих местах


umbra   (2007-07-26 11:56:00) [16]

у меня на Д7 и Вин98 все выглядит как обычно. В чем суперэффект то заключается?


Сергей М.   (2007-07-26 11:53:00) [17]


> окно ведет себя странно


Открою тебе страшную тайну - ShowMessage здесь ни при чем, еще интересней "эффект" выглядит при MessageBox.


Lacmus   (2007-07-26 11:52:00) [18]

>oxffff ©   (26.07.07 11:43) [5]
Указатель на результат IntToStr сохраняется в стеке, в данном случае он будет неправильный (строка произвольной длины)


Kolan   (2007-07-26 11:43:00) [19]

> Супер эффект с showmessage.

Ты таки свернёш башку Delphi :).
Ты не тестером работаешь случайно? А то прям как в старом бОяне:
http://www.ilim.ru/pipermail/filtered/2004-July/005862.html


oxffff   (2007-07-26 11:43:00) [20]

В данном примере  нет AV.
Для сомневающихся октрыть отладчик и посмотреть ebp на месте.

А вот окно ведет себя странно? Почему?


Страницы:   1 2

Наверх

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