Помощь - Поиск - Пользователи - Календарь
Полная версия: Обьектно-орентированность
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ассемблер
gMan
Допустим нарисовал я кнопку. И еще, еще...
А как сделать эту обьектно-орентированность (блин, слово то какое) не пойму! sad.gif

Может кто обьяснит?
BlackShadow
smile.gif
Например создаёшь объект типа
Type
 TButton
   Left:Integer;
   Top:Integer;
   Width:Integer;
   Height:Integer;
   Color:Integer;
   Procedure Paint;
 End;

Procedure TButton.Paint;
Begin
 SetBackgroundColor(Color); {или как там оно зовётся...}
 Bar(Left,Top,Left+Width-1,Top+Height-1)
End;

Но это глупо.
Вот, если сделать какой-то базовый объект типа
Type
 TControl=Object
   Procedure Paoint;Virtual;
 end;

В которм ничего не рисуется, но все твои кнопки, едиты и т. д. и т. п. наследуются от него и перекрывают Paint, то это уже будет на что-то похоже.

А кастовать примерно так:
Var
 Controls:Array[{...}] Of TControl;
 i:Integer;
Begin
 For i:=1 To ControlsCount Do
   Controls[i].Paint
End.

... образно говоря.
gMan
Хм... На паскале то понятно.
А с ассемблером как быть? unsure.gif
BlackShadow
Ну ты загнул. Было у меня дело - писал на асме с ООП, но по памяти не скажу. Посмотрю дома в поннедельник обязательно вышлю. У меня под IDEAL...
gMan
Отлично! жду!
Заранее спасибо.
gMan
Уже ведь вторник, а обещанного нет. :p2:
BlackShadow
Я уже извинился в другом топике - запамятовал (выходные бурные были smile.gif ) Узелок на ... завязал короче. Завтра притораню.
gMan
Ждемс... smile.gif
BlackShadow
Ндя. Особо порадовать нечем. Оказывается поприбивал я всё, что делал под ООП, а книгу спихнул кому-то sad.gif Зато выжил инклюдер и пару воспоминаний.

SEGMENT VMT_Seg PUBLIC
ENDS    VMT_Seg

MACRO VMTSeg
SEGMENT VMT_Seg
ENDM  VMTSeg

@VMTSeg = VMT_Seg

MACRO LoadVMTSeg reg
PUSH @VMTSeg
POP Reg
ENDM  LoadVMTSeg

MPTR EQU <DWORD>

MACRO MakeVMT
VMTSeg
TBLINST
ENDS
CODESEG
ENDM MakeVMT


Чего тут есть:
1). Описывается VMT_Seg. В этом сегменте и будут храниться все VMT.
2). Макрос LoadVMTSeg загружает в сегментный регистр адрес VMTSeg.
3). Тип MPTR описывает тип элементов VMT. Для маленьких моделей памяти можно заменить и на WORD, т. к. достаточно хранить лишь смещение метода.
4). Макрос MakeVMT является основным во всём этом бреде. Он и инициализирует таблицу VMT для объекта. Естественно должен вызываться в конструкторе.

Теперь о воспоминаниях.
Описывается класс как struc, но необычный. В нём может присутствовать такая вот форма:

MyObject Struc
 MyMethod MPTR MyObject_MyMethod
MyObject EndS

Таким вот макаром объявляются методы.
Ещё есть такой момент: конструктор лучше оформить как обычный метод, который вызывает MakeVMT, а затем уже какой-нибудь виртуальный метод инициализации.
Вызывать методы лучше через CALL METHOD Obj.MyMethod. А вот тут точно не помню: это форма сама заносит this/self/me в ES:BX или это самому надо делать, чтобы VMT он нашёл... Ну, это можно и в дебугере уточнить. А вот как описывается наследование, вот этого я действительно не помню sad.gif

З. Ы. : забыл-то про самое главное. Виртуальные методы объявляются вроде так:
VIRTUAL MyFun MPTR MyObj_MyFun
gMan
Спасибо, ты мне очень помог. rolleyes.gif
BlackShadow
Не на чем. Если напишешь чего рабочего, выложи, PLZ, кусок кода, чтоб память освежить... А то неправильно как-то: писал, писал, а тут раз и всё забыл...
gMan
Нет проблем, как напишу - так покажу smile.gif

P.S. Если что нть сам вспомнишь выложи.
gMan
BlackShadow, что если я напишу модуль компонентов на пасе, смогу ли я использовать потом эти компоненты в своей ос на асме, в граф.режиме. Если да, то как вызывать процедуры из паскалевского модуля?
BlackShadow
Давай-ка лучше заново и по-подробнее. Я что-то не особо въехал. Ты спрашиваешь, как использовать процедуру написанную на ASM в паскале? {$L ...) и понеслось. Это ты должен знать. Если наоборот, то EXTERN ...:PROC и поехали.
А если тебе надо из ассемблерного кода поработать с паскалевскими объектами, то это уже другое дело. Рекомендую так: создаёшь класс TObject такого типа:
Type
 TObject=Object
   Constructor Create;
   Procedure Free;
   Destructor Destroy;Virtual;
 End;

Constructor TObject.Create;
Begin
End;

Destructor TObject.Destroy;
Begin
End;

Procedure TObject.Free;
Begin
 Dispose(this,Destroy)
End;

После этого надо заюыть про то, что Dispose сожно вызывать и самому, а пользоваться только Free. А САМОЕ важное - ВСЕ классы должны наследоваться от такого вот TObject. Чего мы этим добились? Мы знаем где находится адрес VMT в объектах и можем их спокойно создавать, кастовать и убивать:).
Чтобы создать объект:
{Creating static object}
PUSH @DATA
PUSH OFFSET InstanceOfMyObject
CALL TSomeObject.Create
{Creating dinamic object}
XOR AX,AX
PUSH AX
PUSH AX
CALL TSomeObject.Create

Что примечательно, последний вариант сам вызовет new и т. д., а так же вернёт тебе поинтёр на инстанс.
Чтобы вызвать какой-то динамический метод:
MOV BX,[WORD PTR InstanceOfMyObject] {Get Offset Of VMT}
MOV AX,@DATA {Segment, where VMT Are Located}
MOV ES,AX
CALL [FAR PTR ES:(BX + 4*MethodNumber)]

Надо заметить, что Method #0 - Destructor.
Чтобы кильнуть:
PUSH SEG MyObj
PUSH OFFSET MyObj
CALL TObject.Free

оно и память освободить и деструктор вызовет.

Вот только я в душе не знаю во что превращаются имена статических методов объектов при компиляции, а так же имена конструкторов... sad.gif
gMan
Спасибо, далее сам догоню smile.gif

Уже что то назревает...

Мне не даёт покоя вопрос:"Стоить ли вообще использовать Паскаль? Или все делать на чистом асме?" sad.gif
На паскале я бы написал ООП и на асме тоже. Но на пасе вроде удобней и наглядней, хотя ОСь написана на Асме. Как то сам не знаю, что хочу sad.gif
Допустим все компоненты бубут на асме, то как сделать так чтобы их могли использовать другие, но не видели исх.код (библеотека короче). На паскале с этим проблем нет. И стоит ли запихивать компоненты в библиотеку(не библиотека она вовсе, а просто файл с процедурами) API функций?
И вообще на каком языке лучше писать ОС?
BlackShadow
А зачем тебе понадобился паскаль? Лень графику делать?
gMan
Нет просто удобнее работать smile.gif

Так все таки лучше, вообше паскаль не трогать?

P.S. Посмотри моё пред последнее сообщение, оно было отредактировано до того как я увидел твоё сообщение.
BlackShadow
Да хоть на басике пиши smile.gif
Чем паскаль удобнее асма?
Цитата
Допустим все компоненты бубут на асме, то как сделать так чтобы их могли использовать другие, но не видели исх.код (библеотека короче). На паскале с этим проблем нет. И стоит ли запихивать компоненты в библиотеку(не библиотека она вовсе, а просто файл с процедурами) API функций?

Вообще нифига не понял.
gMan
Бррр...
Короче на чистом асме писать буду и точка smile.gif

Теперь все заново и попорядку:

Как писать компоненты? Я имею ввиду, стоит ли делать каждый компонент отдельным файлом или все их запихать в один общий файл, а может вообще всё в библиотеку API функций.
BlackShadow
1). А что ты подразумеваешь под компонентом?
2). Как тее удобней. Мне бы было проще распихать их по файлам, а линковать вместе.
3). Ты сначала определись как ты свои API экспортировать будешь.
gMan
Ладно, разберусь как нибудь. Тема закрыта smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.