При возврате управления, метод должен
type
TMyObject = class (TObject)
procedure One;
procedure Two; virtual;
class procedure Three; virtual;
end;
TMyClass = class of TObject;
...
var
MyObject:TMyObject;
MyClass:TMyClass;
вызов MyObject.One
сгенерирует следующий код:
les DI,MyObject
push ES
push DI
call MyObject.One
При возврате управления, метод должен удалить из стека вначале параметр Self, а затем и остальные - явные параметры.
Методы всегда используют дальнюю (far) модель вызова, несмотря на то, каким образом установлена директива компиляции $F. Для вызова виртуального метода, компилятор генерирует код, загружающий из объекта указатель на VMT, и затем вызывает через точку входа в VMT ( ES:[DI]
), ассоциированный с этой точкой входа метод. Например, вызов MyObject.Two
приведет к генерации следующего:
les DI,MyObject
push ES
push DI
les DI, ES:[DI]
call DWORD PTR ES:[DI]
Вызов MyObject.Three
:
les DI,MyObject
les DI, ES:[DI]
push ES
push DI
call DWORD PTR ES:[DI+4]
; +4, т.к. это смещение в VMT для второго
; по счету виртуального метода
А для MyClass.Three
будет сгенерированно:
les DI,MyClass
push ES
push DI
call DWORD PTR ES:[DI+4]
Очевидно, что приведенные примеры генерируемого кода соответствуют 16-разрядной версии Delphi, но по своей идеологии они остаются верной и для Delphi32.
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий