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

Вниз

работа с кодом от dcu2pas v1.3   Найти похожие ветки 

 
Юрий К   (2004-12-14 15:02) [0]

Вопрос по работе с ассемблерным кодом, полученным от dcu2pas v1.3:
Исходный текст на паскале такой:

procedure TPasswordDialog.EditChange(Sender: TObject);
var
 HasText: Boolean;
begin
 HasText := Edit.Text <> "";
 AddButton.Enabled := HasText;
 RemoveButton.Enabled := HasText;
 OKButton.Enabled := HasText or PasswordAdded;
end;


Текст, выданный dcu2pas v1.3 выглядит так:

procedure TPasswordDialog.EditChange(Sender{Flag:$B, Type ID:$6, Offset:$1}: TObject); {Flag:$40, ID:$BBF8EAC, VProc:$4, Return TypeID:$D, Code offset:$108A, Size:$86}
var
 HasText: Boolean; {Flag:$B, ID:$0, Type ID:$7, Offset:$3}
asm
 @@0:        {stack frame start}
 @@3:        push    $00
 @@5:        push    ebx
 @@6:        push    esi
 @@7:        mov     esi, eax
 @@9:        {try}
   @@23:       lea     edx, [ebp-$04]
   @@26:       mov     eax, [esi+$02FC]
   @@32:       call    TControl.GetText
   @@37:       cmp     dword ptr [ebp-$04], +$00
   @@41:       setnz   bl
   @@44:       mov     edx, ebx
   @@46:       mov     eax, [esi+$0300]
   @@52:       mov     ecx, [eax]
   @@54:       call    dword ptr [ecx+$64]
   @@57:       mov     edx, ebx
   @@59:       mov     eax, [esi+$0304]
   @@65:       mov     ecx, [eax]
   @@67:       call    dword ptr [ecx+$64]
   @@70:       test    bl, bl
   @@72:       jnz     @@87
   @@74:       cmp     byte ptr [esi+$0314], $00
   @@81:       jnz     @@87
   @@83:       xor     edx, edx
   @@85:       jmp     @@89
   @@87:       mov     dl, $01
   @@89:       mov     eax, [esi+$030C]
   @@95:       mov     ecx, [eax]
   @@97:       call    dword ptr [ecx+$64]
 @@100:      {finally}
   @@113:      lea     eax, [ebp-$04]
   @@116:      call    System.@LStrClr
 @@121:      {end; finally}
 @@129:      pop     esi
 @@130:      pop     ebx
 @@131:      pop     ecx
 @@132:      {stack frame end}
end;


Я так понимаю (правильно ли?), что конструкции вида
call    dword ptr [ecx+$64]
относятся к вызову функции "SetEnabled".
По этой функции также выдаётся следующая информация

{Address defined in DBPWDlg.dcu:
...
22 TControl.SetAutoSize
23 TControl.SetDragMode
24 TControl.SetEnabled
...}

{Fixups defined in DBPWDlg.dcu:
...
29      E40  1 TControl.SetDragMode
2A      E44  1 TControl.SetEnabled
2B      E48  1 TCustomForm.SetParent
...}

Если бы не было исходного кода, то как воможно узнать, что конструкция call    dword ptr [ecx+$64] относится к вызову функции TControl.SetEnabled?


 
Юрий К   (2004-12-14 20:21) [1]

Есть мнение, что это связано с таблицей виртуальных методов.
Будто бы TControl.SetEnabled является виртуальным методом, а потому надо бы знать эту таблицу.
А кто-нибудь видел какую где инфу по формированию этой таблицы, о способе зачитать как-то её (из exe, dcu-файлов) ?


 
Arnold ©   (2004-12-14 20:24) [2]

посмотри учебник В.Юрова Ассмблер там все ясно и понятно расписано


 
Игорь Шевченко ©   (2004-12-14 23:12) [3]


> Я так понимаю (правильно ли?), что конструкции вида
> call    dword ptr [ecx+$64]
> относятся к вызову функции "SetEnabled".


Правильно понимаешь.


> Есть мнение, что это связано с таблицей виртуальных методов.


Правильное мнение.


> Если бы не было исходного кода, то как воможно узнать, что
> конструкция call    dword ptr [ecx+$64] относится к вызову
> функции TControl.SetEnabled?


Рассчитав таблицу виртуальных методов вручную по исходным текстам компонент для каждой версии Delphi.

С уважением,


 
Юрий К   (2004-12-15 14:32) [4]

"Игорь Шевченко ©   (14.12.04 23:12) [3]
Рассчитав таблицу виртуальных методов вручную по исходным текстам компонент для каждой версии Delphi."

Просьба не оставить без внимания следующие вопросы:
Таблица одна на все классы, или на каждый класс по таблице?
Что бросается в ecx, линк на какое имя, где смотреть, т.е. как вычислить нужное имя класса?


 
Calm ©   (2004-12-15 16:49) [5]


> Таблица одна на все классы, или на каждый класс по таблице?

Предполагаю, что на каждый класс - своя таблица.

Вот имею такую инфу, хотя сам не разу не пользовался.
0 Отсюда и выше (смещение в +) идут адреса виртуальных методов данного класса.Сюда показывает pointer по смещению 0 в экземпляре данного класса
-4 Destroy Деструктор класса
-8 FreeInstance
-12 NewInstance
-16 DefaultHandler
-20 Dispatch
-24 BeforeDestruction
-28 AfterConstruction
-32 SafeCallException
-36 Parent Указатель на поле SelfPtr VMT предка (похож на указатель на экземпляр класса предка)
-40 InstanceSize Размер экземпляра данного класса в байтах
-44 ClassName Указатель на ShortString с именем класса
-48 DynamicTable
-52 MethodTable
-56 FieldTable
-60 TypeInfo
-64 InitTable
-68 AutoTable
-72 IntfTable
-76 SelfPtr Всегда указатель на VMT данного класса. (На эту же таблицу)


 
Юрий К   (2004-12-15 17:54) [6]

А собственно, все ли виртуальные методы классов попадают в exe-шник, без пропусков? Чтобы можно было по сорсам определять местоположение методов в виртуальной таблице?

А что выдаёт MAP файл, который можно получить от компилятора, адреса на код методов?

0001:00029FF0   TControl.Create
0001:0002A0C8   TControl.Destroy
0001:0002A17C   TControl.GetDragImages
0001:0002A180   TControl.GetEnabled
0001:0002A184   TControl.GetPalette
0001:0002A188   TControl.HasParent
0001:0002A190   TControl.GetParentComponent
0001:0002A194   TControl.SetParentComponent
0001:0002A1BC   TControl.PaletteChanged
0001:0002A234   TControl.GetAction
0001:0002A244   TControl.SetAnchors
0001:0002A264   TControl.SetAction
0001:0002A2E0   TControl.IsAnchorsStored
0001:0002A2F8   TControl.SetDragMode
0001:0002A2FC   TControl.RequestAlign
0001:0002A30C   TControl.Resize
0001:0002A32C   TControl.ReadState
0001:0002A3C0   TControl.Notification
0001:0002A404   TControl.SetAlign
0001:0002A4AC   TControl.SetBounds
0001:0002A544   TControl.UpdateAnchorRules
0001:0002A660   TControl.SetLeft
0001:0002A684   TControl.SetTop
0001:0002A6AC   TControl.SetWidth
0001:0002A6D0   TControl.SetHeight
0001:0002A6F4   TControl.Dock
0001:0002A800   TControl.DoDock
0001:0002A858   TControl.SetHelpContext
0001:0002A86C   TControl.SetHelpKeyword
0001:0002A890   TControl.GetBoundsRect
0001:0002A8B0   TControl.SetBoundsRect
0001:0002A8DC   TControl.GetClientRect
0001:0002A8F4   TControl.GetClientWidth
0001:0002A90C   TControl.SetClientWidth
0001:0002A938   TControl.GetClientHeight
0001:0002A950   TControl.SetClientHeight
0001:0002A978   TControl.GetClientOrigin
0001:0002AA08   TControl.ClientToScreen
0001:0002AA34   TControl.ScreenToClient
0001:0002AA60   TControl.SendCancelMode
0001:0002AA90   TControl.SendDockNotification
0001:0002AAFC   TControl.ChangeScale
0001:0002ACB0   TControl.SetAutoSize
0001:0002ACC8   TControl.SetName
0001:0002AD6C   TControl.SetClientSize
0001:0002ADB4   TControl.SetParent
0001:0002AE00   TControl.SetVisible
0001:0002AE3C   TControl.SetEnabled
0001:0002AE54   TControl.GetTextLen


 
Calm ©   (2004-12-16 13:17) [7]


> все ли виртуальные методы классов попадают в exe-шник

Все. Даже те, которые никогда не вызываются.
Опять-таки не могу поручиться за достоверность, но слышал такое мнение на этом сайте.



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

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

Наверх





Память: 0.48 MB
Время: 0.032 c
1-1103303482
fuzzy
2004-12-17 20:11
2005.01.02
Как преобразовать Real --> String. Ф-ия FloatToStr не катит.


14-1101898920
olookin
2004-12-01 14:02
2005.01.02
Прогнозы на 6-й тур Лиги Чемпионов


1-1103523557
Zloy
2004-12-20 09:19
2005.01.02
фокус ячейки в StringGrid


14-1102650151
school
2004-12-10 06:42
2005.01.02
Delphi крякнутый


3-1102071354
Vadim S
2004-12-03 13:55
2005.01.02
Delphi5 +ADO(DMAC 2.6) + MS SQL 2000





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