IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Обьектно-орентированность, в GMODE
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 69
Пол: Мужской
Реальное имя: Вася Пупкин

Репутация: -  1  +


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

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


--------------------
Стабильность - признак мастерства
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






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.

... образно говоря.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 69
Пол: Мужской
Реальное имя: Вася Пупкин

Репутация: -  1  +


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


--------------------
Стабильность - признак мастерства
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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


Пионер
**

Группа: Пользователи
Сообщений: 69
Пол: Мужской
Реальное имя: Вася Пупкин

Репутация: -  1  +


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


--------------------
Стабильность - признак мастерства
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Пионер
**

Группа: Пользователи
Сообщений: 69
Пол: Мужской
Реальное имя: Вася Пупкин

Репутация: -  1  +


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


--------------------
Стабильность - признак мастерства
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Я уже извинился в другом топике - запамятовал (выходные бурные были smile.gif ) Узелок на ... завязал короче. Завтра притораню.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Пионер
**

Группа: Пользователи
Сообщений: 69
Пол: Мужской
Реальное имя: Вася Пупкин

Репутация: -  1  +


Ждемс... smile.gif


--------------------
Стабильность - признак мастерства
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






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


Пионер
**

Группа: Пользователи
Сообщений: 69
Пол: Мужской
Реальное имя: Вася Пупкин

Репутация: -  1  +


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


--------------------
Стабильность - признак мастерства
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






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


Пионер
**

Группа: Пользователи
Сообщений: 69
Пол: Мужской
Реальное имя: Вася Пупкин

Репутация: -  1  +


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

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

Сообщение отредактировано: TheLizard -


--------------------
Стабильность - признак мастерства
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Пионер
**

Группа: Пользователи
Сообщений: 69
Пол: Мужской
Реальное имя: Вася Пупкин

Репутация: -  1  +


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

Сообщение отредактировано: TheLizard -


--------------------
Стабильность - признак мастерства
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






Давай-ка лучше заново и по-подробнее. Я что-то не особо въехал. Ты спрашиваешь, как использовать процедуру написанную на 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
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Пионер
**

Группа: Пользователи
Сообщений: 69
Пол: Мужской
Реальное имя: Вася Пупкин

Репутация: -  1  +


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

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

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

Сообщение отредактировано: TheLizard -


--------------------
Стабильность - признак мастерства
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гость






А зачем тебе понадобился паскаль? Лень графику делать?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Пионер
**

Группа: Пользователи
Сообщений: 69
Пол: Мужской
Реальное имя: Вася Пупкин

Репутация: -  1  +


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

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

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


--------------------
Стабильность - признак мастерства
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Гость






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

Вообще нифига не понял.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Пионер
**

Группа: Пользователи
Сообщений: 69
Пол: Мужской
Реальное имя: Вася Пупкин

Репутация: -  1  +


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

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

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


--------------------
Стабильность - признак мастерства
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Гость






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

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 21:06
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name