Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ассемблер _ Обьектно-орентированность

Автор: gMan 22.07.2004 20:39

Допустим нарисовал я кнопку. И еще, еще...
А как сделать эту обьектно-орентированность (блин, слово то какое) не пойму! sad.gif

Может кто обьяснит?

Автор: BlackShadow 22.07.2004 20:53

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 23.07.2004 2:01

Хм... На паскале то понятно.
А с ассемблером как быть? unsure.gif

Автор: BlackShadow 23.07.2004 15:48

Ну ты загнул. Было у меня дело - писал на асме с ООП, но по памяти не скажу. Посмотрю дома в поннедельник обязательно вышлю. У меня под IDEAL...

Автор: gMan 23.07.2004 16:56

Отлично! жду!
Заранее спасибо.

Автор: gMan 27.07.2004 2:02

Уже ведь вторник, а обещанного нет. :p2:

Автор: BlackShadow 27.07.2004 17:03

Я уже извинился в другом топике - запамятовал (выходные бурные были smile.gif ) Узелок на ... завязал короче. Завтра притораню.

Автор: gMan 27.07.2004 17:15

Ждемс... smile.gif

Автор: BlackShadow 28.07.2004 16:12

Ндя. Особо порадовать нечем. Оказывается поприбивал я всё, что делал под ООП, а книгу спихнул кому-то 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



Прикрепленные файлы
Прикрепленный файл  OOP.Inc ( 262 байт ) Кол-во скачиваний: 2

Автор: gMan 28.07.2004 21:36

Спасибо, ты мне очень помог. rolleyes.gif

Автор: BlackShadow 29.07.2004 17:05

Не на чем. Если напишешь чего рабочего, выложи, PLZ, кусок кода, чтоб память освежить... А то неправильно как-то: писал, писал, а тут раз и всё забыл...

Автор: gMan 29.07.2004 18:06

Нет проблем, как напишу - так покажу smile.gif

P.S. Если что нть сам вспомнишь выложи.

Автор: gMan 31.07.2004 15:41

BlackShadow, что если я напишу модуль компонентов на пасе, смогу ли я использовать потом эти компоненты в своей ос на асме, в граф.режиме. Если да, то как вызывать процедуры из паскалевского модуля?

Автор: BlackShadow 1.08.2004 17:02

Давай-ка лучше заново и по-подробнее. Я что-то не особо въехал. Ты спрашиваешь, как использовать процедуру написанную на 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 1.08.2004 21:17

Спасибо, далее сам догоню smile.gif

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

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

Автор: BlackShadow 1.08.2004 21:20

А зачем тебе понадобился паскаль? Лень графику делать?

Автор: gMan 1.08.2004 21:36

Нет просто удобнее работать smile.gif

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

P.S. Посмотри моё пред последнее сообщение, оно было отредактировано до того как я увидел твоё сообщение.

Автор: BlackShadow 1.08.2004 23:01

Да хоть на басике пиши smile.gif
Чем паскаль удобнее асма?

Цитата
Допустим все компоненты бубут на асме, то как сделать так чтобы их могли использовать другие, но не видели исх.код (библеотека короче). На паскале с этим проблем нет. И стоит ли запихивать компоненты в библиотеку(не библиотека она вовсе, а просто файл с процедурами) API функций?

Вообще нифига не понял.

Автор: gMan 2.08.2004 21:32

Бррр...
Короче на чистом асме писать буду и точка smile.gif

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

Как писать компоненты? Я имею ввиду, стоит ли делать каждый компонент отдельным файлом или все их запихать в один общий файл, а может вообще всё в библиотеку API функций.

Автор: BlackShadow 3.08.2004 16:49

1). А что ты подразумеваешь под компонентом?
2). Как тее удобней. Мне бы было проще распихать их по файлам, а линковать вместе.
3). Ты сначала определись как ты свои API экспортировать будешь.

Автор: gMan 4.08.2004 1:24

Ладно, разберусь как нибудь. Тема закрыта smile.gif