|
|
<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 10 ... 14 . 15 . >> |
| Посл.отвђт | Сообщенiе |
|
|
Дата: Мар 26, 2004 19:10:55 Так что и в данном случае я просто считаю, что это хорошая школа программирования для меня (!) К тому же, те макросы, которые я делаю, возможно, окажутся полезными другим людям для других целей. Пожалуй единственное с чем я согласен в данной дискуссии. Насчёт: и чтоб программисты всего мира работали друг на дружку . Асмом занимаются не случайные люди в том смысле, что, IMHO, что их неустраивают существующие языки верхнего уровня (типа BASIC :-)), по разным причинам от банального желания выделяться среди окружающих, до вполне осознанных вроде "производственной необходимости" (например отсутствие возможности реализовать, какие то функции). А объединяет их, как мне кажется, не желание безоговорочно подчиняться чужим мнениям, и попытка ввести, какие либо новые модели или стандарты в существующий язык Ассемблера либо умрёт на процессе обсуждения (данная тема тому пример) либо потеряет смысл т.к. для реализации одних и тех же функций будет слишком много вариантов, которые будут иметь своих сторонников. В кратце это будет невозможно, потому, что договориться не смогут. А о самой необходимости ООП в АСМ могу сказать только одно: АСМ есть образ мышления компьютера и человеки программирующие на нём используют его потому, что такой образ мышления им ближе, но как говорят "На вкус и цвет товарищей нет" поэтому, мне кажется, что лучше иметь один инструмент (макросы к примеру) позволяющий каждому программеру использовать его для конкретно своего удобства, чем несколько отвечающих понятиям об удобстве несуществующих усреднённых групп программеров. |
|
|
Дата: Мар 26, 2004 19:14:16 S.T.A.S. там ещё букву м надо добавить Не пользовался. Но человек спросил об ООП в АСМе, а по тому, что я о нем слышал это то, что он ищет, возможно. |
|
|
Дата: Мар 26, 2004 19:22:35 2masquer: А мне не в лом набрать первые буквы, а там ИДЕ достроит :) А у меня вообще слепой десятипальцевый способ набора, мне лишние пару кило написать - разминка перед боем. Вообще, на ассеблере, как правило, крупные проекты не пишутся Гы, даже не знаю что на это сказать! Сразил! Ты мой довод, превратил в свой! Мастер! - а я хочу чтоб писалось! По поводу скорости - спорный вопрос. Вопрос можно, боюсь ошибиться, а ты вообще в ООП писал? Просто такое ощущение, что (это догадка, заодно ответь угадал я или нет) ты семестр в универе пробовал писать курсачь в объектах, но до этого ты долго писал в процедурах, ты не понял смысла в ООП, он тебя раздражает, и, успешно сдав курсач, ты вернулся к процедурам? Ну прав я или нет? Это на высокоуровненых языках так, я на асме почему и пишу Ввиду предыдущего предположения - трудно судить о вкусе устриц, не разу их не попробовав. Покажи мне хоть одно ИДЕ которое будет такое поддерживать для ассемблера. сорри не догнал это ты про что? если это про моё вложенность названий: MainForm.ButtonCancel.Handle то смею тебя уверить это возможно, и причем тут IDE? мне еще ассеблерные сорцы индусов и прочих китайцев осталось почитать :))) Батенька, а вас не Адольфом ли кличут? - Глупо помоему, китайцев (как пример) миллиард - ну хоть один то из них толковый найдется? И кто пострадает от того что китаец напишет чтото толковое, чем другие (ну допустим хотя бы один) смогут пользоваться? Имхо, даже сама идея утопична. Вообще это имхо и тут конечно не предирёшься, но, лет пятьдесят назад, идея компа на столе - была утопична. |
|
|
Дата: Мар 26, 2004 19:23:02 · Поправил: S_T_A_S_ JaDS за работоспособность кода не ручаюсь не проверял, но схему я обрисовал Да, идея понятна.. Я пытаюсь двигаться примерно в том же направлении, но вот макросы "macro foo, [name]" я писать ручками не хочу. Их генерацию я возложил на плечи CLASS/ENDC. Первоначально, я за основу взял этот макрос. Как это работает, объяснить в 2х словах у меня не получится, т.к. я сам вникал приличное время.. :) Смысл здесь примерно такой: Есть макросы DWORD/BYTE/etc - как бы базовые типы данных. Когда они находятся ВНУТРИ CLASS/ENDC - они составляют список параметров __class.fields для макроса __class.define, который в свою очередь создает новые макрос и структуру "name". Если они "снаружи", то аналогичны DD/DB/etc.. Вот сырой рабочий пример, что это дает: CLASS MSGH WORD ID ;; message identifier DWORD Handler ;; jump address ENDC CLASS $Wnd ;; \/ default values of fields ;; class data DWORD handle ;; handle to the window DWORD dwExStyle, 0 ;; extended window style ....... MSGH MsgHandle, WM_NULL,$Wnd.WndProc.WM_NULL ;; by default do nothing ;; class procs METHOD Create, $Wnd.Create ;; exported procs for direct calls ...... ENDC ;; CLASS $ConWindow ;; inherited window data !$Wnd ,,ConWindow.WindowName,,,,ConWindow.%CharWidth*ConWindow.%Collum ns,ConWindow.%CharHeight*ConWindow.%Rows,\ \;; message handlers ,<WM_DESTROY,$Wnd.WndProc.WM_DESTROY>;ConWindow.WM_DESTROY> ;; infrequent message should be at odd position MSGH, WM_PAINT,ConWindow.WM_PAINT ;; frequent messages should be at even MSGH, WM_CREATE,ConWindow.WM_CREATE ....... MSGH, WM_NULL,$Wnd.WndProc.WM_NULL ;ConWindow.Default ;; console related stuff DWORD hFont, FALSE DWORD pData, FALSE ENDC Con $ConWindow ;; "объект" ..... invoke Con.Create ;; вызываем "унаследованный" метод Собственно, на этом пока все. Сейчас начал с нуля переделывать этот набор макросов - в старом не получалось нормально "избавиться от промежуточного поля old". Так что пока еще надо много чего добавлять / переделывать - старый формат не совместим. Так что в ближайшем будующем думаю будет и так: Con.Create ;; вызываем "унаследованный" метод Потом будут и виртуальные методы и прочая.. Пока моя задача - реализовать некоторую базу - макросы. Потом уже буду добавлять то, что генерирует код и т.п. Т.е. чтоб в препроцессор были встроены дерективы описания сложных структур данных - этоим я и занимаюсь. Но в препроцессор не лезу - стандартных макросредств FASM'а вполне хватит. Пока делаю простой пример с 2мя окошками - для отладки всех этих макросов. Дальше видно будет.. |
|
|
Дата: Мар 26, 2004 19:29:57 masquer Мне тоже не в лом набрать первые буквы, но экспериментов я не боюсь. я на асме почему и пишу - мне гибкость нужна и отсутствие ограничений - я сам себе и оптимизатор, и компилятор и еще Бог знает кто :) Хм.. это как раз мои причины.. Помимо этого мне приходится жить с формальностями, которые диктует ось. Вот я и подумал: а что мне мешает сделать, к примеру, одну WndProc для всех окошек - я б и DispatchMessage убрал бы, но в XP это хреново работает. Так я и начал формально собирать разрозненные DWORDы в некоторые логически связанные блоки в сырцах.. А вот слепо следовать принципам ООП, которые я до конца не принимаю - это не мое.. В общем-то я прекрасно понимаю вашу позицию - есть отработанные методики приносящие вам требуемый результат. Я вот только проснулся, а привык к меткам вида LS22_E - ну кому сейчас это надо? Сорцы-то в память целиком помещаются :) |
|
|
Дата: Мар 26, 2004 19:47:29 JaDS Сразил! Ты мой довод, превратил в свой! Мастер! - а я хочу чтоб писалось! Вот когда напишешь - тогда и обсудим (как ты там говорил - вкус устриц?) Теоретизировать можно до пены у рта... Просто такое ощущение, что (это догадка, заодно ответь угадал я или нет) ты семестр в универе пробовал писать курсачь в объектах, но до этого ты долго писал в процедурах, ты не понял смысла в ООП, он тебя раздражает, и, успешно сдав курсач, ты вернулся к процедурам? Ну прав я или нет? Я тебя сейчас жутко разочарую и, возможно, придам новую энергию твоим расследованиям и словоизлияниям - я на программера вообще не учился, ни разу, о чем не жалею ни капли :))) Но польщен таким вниманием! А на ООП я писал - и внешнюю и внутренние стороны исследовал (больше внутреннюю реализацию, если честно) вложенность названий: MainForm.ButtonCancel.Handle то смею тебя уверить это возможно, и причем тут IDE? Ну как же - ты же за большие проекты ратуешь, как же тут без ИДЕ - или в notepad-е писать? а вас не Адольфом ли кличут? [глядя в потолок] поменять подпись себе, что-ли? :)))) Ладно, считай это не национальностями, а именами нарицательными :)))))) ну хоть один то из них толковый найдется? пытался, искал, и не только я - увы. Может ищу не там :) И кто пострадает от того что китаец напишет чтото толковое, чем другие (ну допустим хотя бы один) смогут пользоваться? Да ради Бога - пользуйся на здоровье |
|
|
Дата: Мар 26, 2004 19:51:43 S_T_A_S_ а что мне мешает сделать, к примеру, одну WndProc для всех окошек Субклассирование, например :) Одну для всех не получится - неудобно будет, имхо (если ты имеешь в виду то, как, например это в WTL сделано) Я на "ты" - ничего? |
|
|
Дата: Мар 26, 2004 19:52:36 "...Вот я и подумал: а что мне мешает сделать, к примеру, одну WndProc для всех окошек - я б и DispatchMessage убрал бы, но в XP это хреново работает..." Странно, у меня в коде только одна WndProc для всех HWNDs - и всё работает. А почему надо убирать DispatchMessage()? |
|
|
Дата: Мар 26, 2004 20:00:58 pas Не пользовался. Но человек спросил об ООП в АСМе, а по тому, что я о нем слышал это то, что он ищет, возможно. Один мой знакомый решил как-то получить на делфи мааленький экзешник. На второй день бросил затею :) "HLA - это полная ересь, только игра во 2х Героев поможет очиститься от скверны" - цитата с RSDN (с) Aquila. АСМ есть образ мышления компьютера и человеки программирующие на нём используют его потому, что такой образ мышления им ближе Во! Таким же естественным для проца явлется косвенный вызов подпрограммы по адресу, хранящемуся в какой-то таблице. Причем, это занимает меньше места в определенных случаях и дает некоторые другие плюсы. Я кстати, не ввожу никакие стандарты. Я все делаю исключительно для своего удобства. А помимо всего прочего - мои макросы позволят (некоторые эксперименты были) импортировать объявленные структуры (есть проблемы только с UNION) и описания COM объектов прям из Сишных хидеров после их доработки - дведу до ума макросы STRUC / DECLARE_INTERFACE - он работает на основе CLASS/ENDC. |
|
|
Дата: Мар 26, 2004 20:02:20 · Поправил: masquer Один мой знакомый решил как-то получить на делфи мааленький экзешник. На второй день бросил затею :) Я как-то видел исходники, которые на делфи компилировались в очень маленький экзешник. Там, правда, чистый апи и ничего лишнего не было |
|
|
Дата: Мар 26, 2004 20:29:21 masquer Ничего. Субклассирование для меня слишком сложно, к тому же мне не надо много окошек. Пока выгдядит так: ;;==================================================================== ======= ;; window procedure proc $Wnd.WndProc , hwnd,uMsg,wParam,lParam begin invoke GetWindowLong, [hwnd],GWL_USERDATA ;; pointer to SWnd object movzx edx, W[uMsg] ;; MS allows to use only WORD cmp dx, WM_NCCREATE ;; shorter than "cmp Edx, WM_NCCREATE" je .WM_NCCREATE ;; the only message to be processed ;cmp edx, WM_DESTROY ;; this should be done in some object ;je .WM_DESTROY or eax, eax je .Def ;; not a SWnd window push ebp mov ebp, eax ;; prepare pointer for use add eax, $Wnd.MsgHandle ;; message table .rep: shl eax,1 ;; the result of these 2 lines is the same as shr eax,1 ;; "and eax, 7FFFFFFFh", but one byte shorter @@: movzx ecx, W[eax+MSGH.ID] ;; get element from table add eax, sizeof.MSGH ;; next table element or ecx, ecx ;; if zero, the end. process default je .WM_NULL cmp ecx, edx ;; check message jne @b ;; not our message mov eax, [eax+MSGH.Handler-sizeof.MSGH] ;; get address or eax, eax ;; check type. prog or new table js .rep ;; new table. the sign bit will be cleared abowe call eax ;; call msg_handler: ;; proc msg_handler , MSGHP,hwnd,uMsg,wParam,lParam ;; msg_handler should return back here using retn instruction ;; predefined message handlers .WM_NULL: pop ebp .Def: if ..STACKFRAME eq .stdcall.EBP ;; this isn't needed leave ;; just some remark end if ;; in the case of changing stackframe jmp [DefWindowProc] .WM_NCCREATE: mov eax, [lParam] ;; Pointer to the CREATESTRUCT structure mov edx, [hwnd] ;; this parameter is already valid mov eax, [eax+CREATESTRUCT.lpCreateParams] ;; window object address mov [eax+$Wnd.handle], edx ;; store hwnd invoke SetWindowLong, edx, GWL_USERDATA, EAX ;; pointer to SWnd object jmp .Def ;; this is called by above "call eax" .WM_DESTROY: invoke PostQuitMessage,0 retn endp AsmGuru62 Странно, у меня в коде только одна WndProc для всех HWNDs - и всё работает Судя по примерам из MSDN, рекомендуется использовать различные для окошек, которые по-разному обрабатывают сообщения.. Или Subclassing a Window А почему надо убирать DispatchMessage()? Ну в общем-то не надо, но можно бы.. Что делает эта штука, кроме как вызывает мою же WndProc после блуждания по dll? Во всех системах до XP это работает без проблем, а вот в последней МС зделали GhostWindow - так что есть некоторые проблемы с отображением окна, если ее пропускать. |
|
|
Дата: Мар 26, 2004 21:12:17 2S_T_A_S_: прям из Сишных хидеров А вот это даже я не одобряю, подкладывать асм под сишные хедеры - бррр. Это конечно упростит жизнь, но лучше напрячься и переделать под асм. По поводу делфей: не знай к чему этот разговор завели, но (Delphi 6): 1) самая маленькая прога (begin end.) - 8kb 2) с использованием KOL - 15kb 3) с использованием VCL - 351k И вот тут есть один ньюанс. KOL тоже писал человек хорошо относящийся к асму, пример: function TCanvas.GetBrush: PGraphicTool;
asm
MOV ECX, [EAX].fBrush
INC ECX
LOOP @@exit
PUSH EAX
CALL NewBrush
POP EDX
PUSH EAX
MOV [EDX].fBrush, EAX
MOV [EAX].TGraphicTool.fOnChange.TMethod.Code, Offset[TCanvas.ObjectChanged]
MOV [EAX].TGraphicTool.fOnChange.TMethod.Data, EDX
MOV ECX, [EDX].fOwnerControl
JECXZ @@1
PUSH [ECX].TControl.fBrush
MOV ECX, [ECX].TControl.fColor
MOV [EAX].TGraphicTool.fData.Color, ECX
POP EDX
TEST EDX, EDX
JZ @@1
CALL TGraphicTool.Assign
@@1: POP ECX
@@exit: XCHG EAX, ECX
end;
Там всё в таком стиле (kol.pas - 1.84Mb - 62 тысячи строк). Как можете заметить от делфей тут взято только ООП. Всё остальное на асме, видимо человек так и не нашел "нормального" ООП в асме (хотя ИДЕ у делфей тоже ничего, дико FRESH напоминает:). Так вот, парой кликов мышкой я могу в KOL сделать интерфейс (формы кнопки меню ...) И я не потеряю сильно ни в коде ни в производительности, а вот конкретный критический кусок я пишу в асме (хотя судя по коду KOL - весь интерфейс критичен:) - но это изврат, делфи накладывает свой отпечаток, да и встроенный ассемблер - убого. Вот хотелось бы похожее только в асме, чтоб можно было быстро собрать интерфейс, а потом уделять внимание только критичным участкам. - Опять вернусь к вопросу - Ну и пиши это в делфях/си - дело в том что асм намного более гибок чем встроенный асм, и хочется совместить эту гибкость асма и мощьность ООП. PS: при чем тут вообще делфя? |
|
|
Дата: Мар 26, 2004 22:32:49 [ S_T_A_S_: Один мой знакомый решил как-то получить на делфи мааленький экзешник. На второй день бросил затею :)] Ага.., я недавно пробовал, результаты для Delphi7 exe'шник ~14Kb и dll'ка ~13Kb. Там не удаётся избавиться от первого call'а, а в нём такой мусор что глаза на лоб лезут.. Короче, не нужен асм'у OOP, у него другое предназначение, иначе так можно все языки испоганить, превратив в Delphi ;-) |
|
|
Дата: Мар 26, 2004 22:34:21 [ JaDS: 1) самая маленькая прога (begin end.) - 8kb] Это было только на 6-й, а на 7-й в два раза больше ;-))) |
|
|
Дата: Мар 26, 2004 22:51:27 >Короче, не нужен асм'у OOP, у него другое предназначение, иначе так можно все языки испоганить Но-но! Ты это, сапогами-то в душу не лезь! Реюзабильность кода - это очень важная штука. Давай я тебе проект дам и дам две недели на завершение. А ты мне за эти две недели настрадай все с нуля. Ну как, не поплохело? Нужен асму ООП и еще как! Глядишь, так и юзать начнут хоть когда-то. А KOL с ООП вы не мешайте! Есть разница просто в переписывании процедуры на асме и мышлением на уровне ООП. S_T_A_S_ JaDS ОРЛЫ! Я за вас кулаки держу! |
<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 10 ... 14 . 15 . >> |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.323 |