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

Вниз

Messages   Найти похожие ветки 

 
Домарощинер   (2004-02-09 15:04) [0]

Объясните построчно на пальцах, что значит этот код?

procedure TObject.Dispatch(var Message);
asm
PUSH ESI
MOV SI,[EDX]
OR SI,SI
JE @@default
CMP SI,0C000H
JAE @@default
PUSH EAX
MOV EAX,[EAX]
CALL GetDynaMethod
POP EAX
JE @@default
MOV ECX,ESI
POP ESI
JMP ECX

@@default:
POP ESI
MOV ECX,[EAX]
JMP dword ptr [ECX].vmtDefaultHandler
end;


 
Dimman1   (2004-02-09 15:11) [1]

PUSH ESI ;положить в стек ESI
MOV SI,[EDX] ;в si - слово по адресу из EDX
OR SI,SI ; сравнение по ИЛИ si с самим собой
JE @@default ; если равно, то переход на default
CMP SI,0C000H ; сравниваем si c $0C000
JAE @@default ; сли больше или рано, то на default
PUSH EAX ; eax - в стек (как параметр наверное к функции GetDynaMethod)
MOV EAX,[EAX] ; в eax DWORD из адреса, на который она показывает
CALL GetDynaMethod ; вызов функции GetDynaMethod
POP EAX ; из стека в EAX - видать результат GetDynaMethod
JE @@default ; если флаг равенства установлен, то на default

ну и дальше в таком духе ;)


 
MBo   (2004-02-09 15:11) [2]

Ну построчно долго, а вкратце - вызывается динамический метод объекта, адрес которого (Self) передается процедуре в EAX, а адрес структуры-сообщения (var Message)- в EDX


 
Digitman   (2004-02-09 16:38) [3]


> Объясните построчно на пальцах


а на кой шут тебе это нужно ?
ты хочешь понять зачем нужен этот метод и как его применять ? или что ?


 
Mystic   (2004-02-09 16:42) [4]

Надо сказать спасибо, мог бы System.pas, SysUtils, Classes и Controls выложить...


 
DiamondShark   (2004-02-09 17:50) [5]

procedure TObject.Dispatch(var Message);
asm
;На входе
; EAX - self
; EDX - @Message
PUSH ESI ;так нада
MOV SI,[EDX] ;первое поле в записи Message
;код сообщения.
;Он будет использован как индекс обработчика
; проверка диапазона
OR SI,SI
JE @@default
CMP SI,0C000H
JAE @@default

PUSH EAX ;типа, сохранили
MOV EAX,[EAX] ;в EAX теперь адрес VMT
CALL GetDynaMethod ;получить адрес dynamic метода
;по индексу. С раскруткой по предкам

POP EAX ;восстановили self
JE @@default ;если метод не найден
MOV ECX,ESI ;адрес метода
POP ESI ;восстановили ESI
JMP ECX ;пошли к обработчику

;метод не найден либо индекс вне допустимого диапазона
@@default:
POP ESI ;восстановили ESI
MOV ECX,[EAX] ;в ECX адрес VMT
;пошли в self.DefaultHandler
JMP dword ptr [ECX].vmtDefaultHandler
end;


 
Домарощинер   (2004-02-10 18:06) [6]

2DiamondShark © (09.02.04 17:50) [5]
Супер!
Моё почтение!
Это именно то, что нужно.
А то вот садиться за изучение асма пока не созрел... хотя понимаю, что надо...)

2Mystic © (09.02.04 16:42) [4]
если не хочешь, чтоб я это сделал, объясни на пальцах, как работают сообщения на низком уровне в виндах и как они непосредственно реализованы в Делфях.
Буду очень признателен.%)


 
Игорь Шевченко   (2004-02-10 18:09) [7]


> объясни на пальцах, как работают сообщения на низком уровне
> в виндах


Очень просто - кто-то посылает, кто-то принимает. Дядюшка Джеффри Рихтер очень популярно объясняет. Скачать можно на www.podgoretsky.com


 
vuk   (2004-02-10 18:13) [8]

to Домарощинер:
>как они непосредственно реализованы в Делфях
Непосредственно в VCL обработка сообщений сделана через message методы. По сути это динамические методы, у которых индекс равен коду обрабатываемого сообщения. Для обычных динамических методоа этот индекс генерируется компилятором и явно задан быть не может.


 
Alex Konshin   (2004-02-10 23:16) [9]

DiamondShark © (09.02.04 17:50) [5]
Просили же на пальцах, а я как ни искал, так ни одного "в натуре" и не нашел :-(.
:)


 
Домарощинер   (2004-02-11 13:33) [10]

2Игорь Шевченко © (10.02.04 18:09) [7]
Имеется такой дядюшка. Даже хотелось его распечатать и почитывать перед сном, но потом пришёл к выводу, что для начала неплохо бы изучить ц/ц++...воизбежание%)

2vuk © (10.02.04 18:13) [8]

> Для обычных динамических методоа этот индекс генерируется
> компилятором и явно задан быть не может.

А для каких методов этот индекс можно задать явно?

2Alex Konshin © (10.02.04 23:16) [9]
Неизвестная распальцовка?;о)


 
Игорь Шевченко   (2004-02-11 13:45) [11]


> А для каких методов этот индекс можно задать явно?


Для сообщений. Директивой message Имя_сообщения


 
DiamondShark   (2004-02-11 15:42) [12]


> Alex Konshin © (10.02.04 23:16) [9]

Зато там было "типа" ;-)



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

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

Наверх




Память: 0.47 MB
Время: 0.006 c
1-6025
Layner
2004-02-19 09:29
2004.03.03
Есть 2й массив, X на Y, как узнать сумму одного столбца?


1-6067
Александр1
2004-02-21 13:46
2004.03.03
Есть ли компонент аналогичный StringGrid


1-6030
Незнающий
2004-02-18 16:48
2004.03.03
Как в TListBox отследить изменение текущего элемента (ItemIndex)?


7-6258
Yuve
2003-12-13 13:23
2004.03.03
Comport


6-6180
alexEagle
2003-12-25 20:18
2004.03.03
Непонятная ошибка при вызове WSAWaitForMultipleEvents





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