Board.KolibriOS.org

Official KolibriOS board
It is currently Tue Feb 25, 2020 6:25 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 166 posts ]  Go to page Previous 18 9 10 11 12 Next
Author Message
 Post subject: Re: Начинающий
PostPosted: Sat Jan 05, 2013 2:06 pm 
Offline
User avatar

Joined: Mon Jul 25, 2011 6:22 pm
Posts: 93
Leency wrote:
1. Помогите разобраться: абстрактный класс - это класс на основе которого нельзя создать объект, а можно только наследовать и уже тогда через дочерний класс работать с ним?

2. Зачем нужен интерфейс, если есть классы? Что он даёт? Только, пожалуйста, по простому.

Leency, ты решил Java освоить?
1. Всё верно;
2. Интерфейс это в своём роде абстракция класса, но с более расширенными возможностями.
В общем на эту тему есть куча интернет-литературы (.pdf, ...).

_________________
Программист не тот, кто постоянно пишет КОД, а тот кто сможет понять чужой КОД!!!


Top
   
 Post subject: Re: Начинающий
PostPosted: Sat Jan 05, 2013 2:16 pm 
Offline
User avatar

Joined: Mon Jul 25, 2011 6:22 pm
Posts: 93
Вообще-то, значение Интерфейсов сложно объяснить словами, каждый для себя его воспринимает по-разному.
Если задуматься о самом значении слова Интерфейс, то это нечто соединяющие (связующие) какой-то объект с другим объектом.

_________________
Программист не тот, кто постоянно пишет КОД, а тот кто сможет понять чужой КОД!!!


Top
   
 Post subject: Re: Начинающий
PostPosted: Sat Jan 05, 2013 10:46 pm 
Offline
User avatar

Joined: Tue May 08, 2007 12:44 am
Posts: 346
Интерфейсы используются в тех языках, авторы которых не смогли решить проблему множественного наследования и, перестраховавшись, разрешили его только от интерфейсов.

_________________
Разработчик языка программирования Кантор


Top
   
 Post subject: Re: Начинающий
PostPosted: Fri Jan 11, 2013 10:39 pm 
Offline
User avatar

Joined: Mon Nov 19, 2012 5:22 pm
Posts: 457
Не понимаю, как динамические библиотеки используют память? Типа как
mov eax,[var]
var dd 123
Они же динамические. Как они определяют куда писать/читать.

_________________
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!


Top
   
 Post subject: Re: Начинающий
PostPosted: Sat Jan 12, 2013 1:12 am 
Offline
User avatar

Joined: Mon Oct 27, 2008 10:10 pm
Posts: 814
GerdtR wrote:
Они же динамические. Как они определяют куда писать/читать.

Как в Windows такой код себя поведет не знаю. А в Колибри если сделать подобное, то сначала будет создаваться локальная копия всей бибилиотеки для конкретного приложения. И меняться будет данные в локальной версии библиотеки. Это расходует память, т. к. создается копия не только для переменных а и для програмного кода. Потому подобных ситуаций следует избегать, но во многих библиотеках они встречаються.


Top
   
 Post subject: Re: Начинающий
PostPosted: Sun Jan 13, 2013 6:32 pm 
Offline
User avatar

Joined: Mon Nov 19, 2012 5:22 pm
Posts: 457
Т.е. мне лучше просто выделить динамически память и использовать её через указатель в качестве переменных? Кстати далёкие переходы тоже лучше не делать? Только относительные?

_________________
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!


Top
   
 Post subject: Re: Начинающий
PostPosted: Mon Jan 14, 2013 12:06 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1621
GerdtR, при компиляции команды типа mov eax,[var] fasm генерирует код команды и запоминает, что на таком-то месте был адрес var. В двоичном формате это знание успешно игнорируется, но в более сложных форматах в той или иной форме есть список перемещаемых элементов aka relocations, в котором записано, что там-то и там-то находятся адреса. Загрузчик библиотеки уже знает, где именно в памяти размещена библиотека, и проходит по списку перемещаемых элементов, корректируя адреса. В результате после загрузки mov eax,[var] читает откуда надо.
IgorA, неверно. Нет никакой локальной копии всей библиотеки для конкретного приложения.
GerdtR, глобальных переменных действительно лучше избегать, но по причинам, не связанным с библиотеками: глобальные переменные, к которым много обращений, могут существенно усложнить выяснение "какая собака здесь порылась, что теперь у переменных какие-то странные значения"; с глобальными переменными обязательно будут проблемы, если к ним есть обращение из двух потоков параллельно. Глобальные константы - возможно, вычисляемые и записываемые один раз при инициализации, но не при работе - пожалуйста. И, между прочим, каждый адрес глобальной переменной - 4 байта в коде и лишняя запись в таблице перемещаемых элементов. Лучше использовать локальные переменные:
Code:
include 'proc32.inc'
proc MyAwesomeProc
locals
var1 dd ?
var2 dd ?
endl
mov [var1],eax
ret
endp

Для справки: это транслируется примерно в
Code:
if used MyAwesomeProc
MyAwesomeProc:
push ebp
mov ebp, esp
sub esp, 8 ; allocate space for two dword variables
mov [ebp-4], eax
leave
ret
end if

Локальные переменные создаются на стеке, для их адресации используется регистр ebp. Если регистров не хватает и очень хочется задействовать ebp для вычислений, то можно адресовать и напрямую через esp:
Code:
proc MyAwesomeProc
sub esp, 8 ; allocate space for two dwords
virtual at esp
.var1 dd ?
.var2 dd ?
end virtual
mov [.var1], eax
add esp, 8 ; restore the stack
ret
endp

но тогда придётся очень внимательно следить за всеми операциями со стеком, которые сбивают esp; кроме того, адресация через esp экономит на прологе push ebp/mov ebp,esp, но теряет по байту на каждом обращении к переменным.

_________________
Сделаем мир лучше!


Top
   
 Post subject: Re: Начинающий
PostPosted: Mon Jan 14, 2013 7:29 pm 
Offline
User avatar

Joined: Mon Oct 27, 2008 10:10 pm
Posts: 814
CleverMouse wrote:
IgorA, неверно. Нет никакой локальной копии всей библиотеки для конкретного приложения.

Странно, мне Марио раньше сказал совсем другое, вот цитата из моего ЛС:
Quote:
Только сейчас заметил, то что ты сделал в SVN r. 1489.
Я не знаю сам ли ты додумался или кто подсказал столь гениальное решение, но ты в курсе что записывая в область памяти библиотеки ты автоматом создаешь дублирующую копию всей библиотеки Box_Lib в памяти приложения вызвавшего Lib_Init?

Программа перестает пользоваться спроецированной копией библиотеки и следовательно каждая программа будет потреблять лишнюю память в размере 60 Кб (если не ошибаюсь). С одной стороны немного, но с другой это нехорошая тенденция.

Изменяемые данные должны храниться только в области специально предназначенной для работы - work area, обычно так ее называют. Она не является частью библиотеки и на нее передается указатель через стек. Твои изменения сломали этот подход.


Top
   
 Post subject: Re: Начинающий
PostPosted: Mon Jan 14, 2013 7:50 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1621
Я не знаю, откуда Марио это взял. В действительности там постраничный copy-on-write: viewtopic.php?p=29192#p29192

_________________
Сделаем мир лучше!


Top
   
 Post subject: Re: Начинающий
PostPosted: Tue Jan 15, 2013 8:24 pm 
Offline
User avatar

Joined: Mon Nov 19, 2012 5:22 pm
Posts: 457
За идею с локальными переменными спасибо, в некоторых случаях подойдёт. Хотя глобальные всё равно надо. Хотя я использовал их как в обычной проге. Запустилось и сбоев никаких. Только лишь хотелось как-то поэкономней с размером библиотеки. Затраты опер. памяти пока особо не волнует.

_________________
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!


Top
   
 Post subject: Re: Начинающий
PostPosted: Wed Jan 16, 2013 12:06 am 
Offline
User avatar

Joined: Mon Nov 19, 2012 5:22 pm
Posts: 457
И ещё вопрос))) Надо чтобы во время работы окна MsgBox основное приложение останавливалось и ждало результата. Хотел всё основать на проверке первого байта в структуре сообщения на 0, но оказалось, что при закрытии бокса(я про крестик, разумеется) там так и остаётся ноль. И функцию на крестик нельзя приделать(не понимаю, зачем так сделано) Можно ли всё-таки обойтись библиотекой или свою мини-версию делать?
И ещё) Когда выделяешь память, то она забита нулями или как получится?
И ещё)). Вин функции сохраняют регистры, поэтому приходится делать тоже самое. Я делаю это при помощи pushad/popad. Но когда функция должна вернуть значение приходится как-то сохранять значение. Пока я это делал так:
mov [var],eax
popad
mov eax,[var]
Теперь, конечно, сделаю var локальным, но вообще как такое обычно делают? Нырял в исходники ядра, что бы посмотреть на сам код int40h, но пока ни разу до шёл)))

_________________
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!


Top
   
 Post subject: Re: Начинающий
PostPosted: Wed Jan 16, 2013 10:36 am 
Offline
User avatar

Joined: Mon Oct 27, 2008 10:10 pm
Posts: 814
GerdtR wrote:
И функцию на крестик нельзя приделать(не понимаю, зачем так сделано) Можно ли всё-таки обойтись библиотекой или свою мини-версию делать?

Чтобы сделать функцию на крестик нужно дорабатывать код самой msgbox. Это не было сделано потому что такое никто не просил сделать. На форуме есть тема посвященная бибилотеке msgbox :
viewtopic.php?f=45&t=1241
С нее можно скачать исходные коды бибилиотеки, чтобы доработать ее. Вот только на svn исходных кодов нет, там сразу файл msgbox.obj идет.
GerdtR wrote:
Когда выделяешь память, то она забита нулями или как получится?

В виндовсе в большинстве случаев да, но может быть и мусор. Как в Колибри не знаю, наверное также.
GerdtR wrote:
Вин функции сохраняют регистры, поэтому приходится делать тоже самое. Я делаю это при помощи pushad/popad.

Вин функции возвращают значение через регистр eax, потому скорее всего в них делается push/pop для всех изменяемых регистров кроме eax.
Есть еще один способ возвращения значения, через стек. Но этот способ сложноват, потому что нужно правильно вычислить место в стеке где будет возвращаемое значение.


Top
   
 Post subject: Re: Начинающий
PostPosted: Wed Jan 16, 2013 12:26 pm 
Offline

Joined: Thu Feb 19, 2009 12:57 pm
Posts: 68
IgorA wrote:
Вин функции возвращают значение через регистр eax, потому скорее всего в них делается push/pop для всех изменяемых регистров кроме eax.

По соглашениям stdcall и cdecl функция может менять eax, ecx, edx, об их сохранности должен заботиться вызывающий код. Пруф


Top
   
 Post subject: Re: Начинающий
PostPosted: Wed Jan 16, 2013 12:38 pm 
Offline
User avatar

Joined: Fri Jun 27, 2008 3:22 pm
Posts: 988
Code:
push ebx ecx edx esi ;registers saved
;...
pop esi edx ecx ebx ;registers restored


Top
   
 Post subject: Re: Начинающий
PostPosted: Wed Jan 16, 2013 1:25 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1621
GerdtR wrote:
И ещё) Когда выделяешь память, то она забита нулями или как получится?

Зависит от того, что значит "выделять память". Функции ядра типа 68.12 обнуляют память при выделении. Но они оперируют целыми страницами, и если нужно выделять мелкие куски типа нескольких десятков байт, получается излишний расход памяти. В подобных случаях нужно использовать какой-нибудь user-mode менеджер, выделяющий, условно говоря, одну страницу из системы, какую-то часть этой страницы для поддержки собственной информации, остальное нарезающий кусками по запросу; user-mode менеджеры, как правило, ничего не гарантируют - новый кусок вполне может содержать данные, оставшиеся от ранее выделенного и освобождённого куска.
GerdtR wrote:
И ещё)). Вин функции сохраняют регистры, поэтому приходится делать тоже самое. Я делаю это при помощи pushad/popad. Но когда функция должна вернуть значение приходится как-то сохранять значение. Пока я это делал так:
mov [var],eax
popad
mov eax,[var]
Теперь, конечно, сделаю var локальным, но вообще как такое обычно делают? Нырял в исходники ядра, что бы посмотреть на сам код int40h, но пока ни разу до шёл)))

pushad/popad относительно медленные, хотя и короткие. Лучше сохранять и восстанавливать только те регистры, которые нужно восстановить - например, только ebx, esi, edi. Именно в такой постановке можно написать
Code:
mov [esp+1Ch],eax
popad

_________________
Сделаем мир лучше!


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 166 posts ]  Go to page Previous 18 9 10 11 12 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited