Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.02;
Скачать: CL | DM;

Вниз

работа с кодом от 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.045 c
14-1102710383
Кудесник
2004-12-10 23:26
2005.01.02
Трансформация зрения...


14-1103112294
Dmitriy O.
2004-12-15 15:04
2005.01.02
Compact using !


14-1103133821
Чеширский_Кот
2004-12-15 21:03
2005.01.02
Болельщики Зенита сегодня молятся на греков


3-1101902955
Del
2004-12-01 15:09
2005.01.02
Новые компоненты для работы с базой


14-1102824170
ms
2004-12-12 07:02
2005.01.02
Помогите пожалуйста по QBasic у