Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];

Вниз

Супер эффект с showmessage.   Найти похожие ветки 

 
oxffff ©   (2007-07-26 11:33) [0]

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;

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


 
Игорь Шевченко ©   (2007-07-26 11:34) [1]


> Что это за эффект?


Неаккуратность программиста.


 
oxffff ©   (2007-07-26 11:38) [2]


> Игорь Шевченко ©   (26.07.07 11:34) [1]
>
> > Что это за эффект?
>
>
> Неаккуратность программиста.


Я бы так не сказал. Пример надуман.

Причина его проявления в некратности указателя esp DWORD.
А почему?


 
Сергей М. ©   (2007-07-26 11:39) [3]


> oxffff ©   (26.07.07 11:33)


А нефих столь фривольно манипулировать вершиной стека в Win32)


 
oxffff ©   (2007-07-26 11:41) [4]


> Сергей М. ©   (26.07.07 11:39) [3]
>
> > oxffff ©   (26.07.07 11:33)
>
>
> А нефих столь фривольно манипулировать вершиной стека в
> Win32)


Вы запустили пример?
Почему окно при вызове showmessage имеет произвольные формы.
А при кратности DWORD нормальные?

С чем это связано?


 
oxffff ©   (2007-07-26 11:43) [5]

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

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


 
Kolan ©   (2007-07-26 11:43) [6]

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

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


 
Lacmus ©   (2007-07-26 11:52) [7]

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


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


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


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


 
umbra ©   (2007-07-26 11:56) [9]

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


 
oxffff ©   (2007-07-26 11:56) [10]


> 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

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


 
oxffff ©   (2007-07-26 12:01) [11]


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


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

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


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


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


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

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


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


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


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


 
Lacmus ©   (2007-07-26 12:32) [14]



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:40) [15]


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


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


 
Lacmus ©   (2007-07-26 12:52) [16]

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

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

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


 
oxffff ©   (2007-07-26 13:13) [17]

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


 
SlymRO ©   (2007-07-26 14:19) [18]

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

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


 
SlymRO ©   (2007-07-26 14:33) [19]

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 EBX registers, 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.


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


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


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

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


 
Lacmus ©   (2007-07-26 14:52) [21]

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

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


 
oxffff ©   (2007-07-26 14:58) [22]


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


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


 
oxffff ©   (2007-07-26 15:01) [23]

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


 
oxffff ©   (2007-07-26 15:02) [24]

Sorry не туда.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.04 c
15-1189250656
tesseract
2007-09-08 15:24
2007.10.07
Футболки обсуждаем тут!


4-1176088521
Alex_AA
2007-04-09 07:15
2007.10.07
Как определить размер монитора?


1-1185336663
Dr. Andrew
2007-07-25 08:11
2007.10.07
Как корректно вызвать функцию function GetIniInt в Inno Setup


2-1189278252
Fin
2007-09-08 23:04
2007.10.07
Как узнать код символа в юникоде.


15-1189166684
Kerk
2007-09-07 16:04
2007.10.07
Какнить можно в винде кэш DNS сбросить?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский