Форум: "Основная";
Текущий архив: 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