Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Чт дек 13, 2018 4:39 pm

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 16 сообщений ]  На страницу 1 2 След.
Автор Сообщение
 Заголовок сообщения: Вопрос(ы) по internals(кишкам) Колибри
СообщениеДобавлено: Ср ноя 28, 2018 4:06 am 
Не в сети

Зарегистрирован: Чт авг 04, 2016 10:43 am
Сообщения: 11
1. SF_SET_EVENTS_MASK - Гарантирует ли, что SF_WAIT_EVENT вернет в eax строго определенный набор значений? (или, как говорится, нужен 2й jmp на случай, если 1й jmp не сработает?)
2. Если приложение имеет конечное число кнопок можно ли их обрабатывать через jmptable без проверки границ? или впоследствии кто-то чего-то может дописать - своеобразую инъекцию общесистемных дополнительных кнопок, которые окажутся не учтены в конечной таблице jmptable?
3. process_information.wnd_state: что значит окно свернутое в заголовок? как перевести окно в это состояние не программно(т.е. через юзеринтерфейс: мышкой, клавиатурой, через меню)? вывести из него?
продолжение следует...
На первый и второй вопросы принял допущение, что "да". Но решил спросить... на всякий.

П.С. если тема размещена не корректно - перенесите тему.


Вернуться к началу
СообщениеДобавлено: Ср ноя 28, 2018 1:42 pm 
Не в сети

Зарегистрирован: Вт июн 24, 2008 11:12 pm
Сообщения: 64
ProMiNick писал(а):
3. process_information.wnd_state: что значит окно свернутое в заголовок? как перевести окно в это состояние не программно(т.е. через юзеринтерфейс: мышкой, клавиатурой, через меню)? вывести из него?
Правый клик мыши на заголовке окна. Выглядит так: viewtopic.php?f=36&t=3784#p72291


Вернуться к началу
СообщениеДобавлено: Пт ноя 30, 2018 12:12 am 
Не в сети

Зарегистрирован: Чт авг 04, 2016 10:43 am
Сообщения: 11
Лицензионное соглашение:
Все, что я публикую на страницах этого форума является собственностью всех пользователей семейства языков fasm, и на код и на макроинструкции распространяются те же свободы как если бы они были размещены на страницах board.flatassembler.net.
То есть любой публикуемый мной код или макроконструкции на страницах этого форума является общенародным, любой вправе его использовать как строительные блоки для своих творений без каких либо указаний на мое авторство или на источник, а также любой вправе без ограничений указывать собственное авторство под совокупным кодом включающим мой код, или без ограничений причислять совокупный код как неотъемлемую часть ОС и накладывать на совокупный код право собственности и применять к этой ОС любые лицензии.

предлагаю добавить в макросы macros.inc:
Код:
macro movastr from
{ local ..move
        match [<],from {std\}
        match [>],from {cld\}
..move:
        lodsb
        stosb
        test    al,al
        jnz     ..move }


Код:
macro seekachar achar*,from ;для случая когда строка в ESI
{ local ..seek
        match [<],from {std\}
        match [>],from {cld\}
..seek:
        lodsb
        cmp     al,achar
        jnz     ..seek }


Код:
macro seekrachar achar,from ;для случая когда строка в EDI
{       match [<],from {std\}
        match [>],from {cld\}
        match any,achar {mov al,achar\}
        repne   scasb }


данные макросы увеличили бы читаемость, скажем процедуры @copy_path макроса @use_library:
Код:
@copy_path:
        or      ecx,-1
        movastr [>]
        dec     edi
        seekrachar '/',[<]
        mov     esi,ebx
        test    esi,esi
        jz      .outof..loop
.via..loop:
        cmp word[esi],'..'
        jne .outof..loop
        add esi,3 ;¯à®¯ã᪠¥¬ ®¤­® ¯®¤­ï⨥ '../'
        seekrachar ;'/',[<]
        jmp .via..loop
.outof..loop:
        cld
        add     edi,2
        test    esi,esi
        jz      .str_lp4
        movastr ;[>]
        dec     edi
.str_lp4:
        mov     esi,ebp;
        movastr ;[>]
        ret

И раз уж мы пихаем в стек ВСЕ РЕГИСТРЫ!!! Использовать после этого для 4х параметров стек вместо полностью свободных регистров - верх расточительства.(facepalm)
Код:
macro copypath lib_name,dir_path,lib_path,point_dir_name
{       pushad
        mov     ebx,point_dir_name
        mov     esi,dir_path
        mov     edi,lib_path
        mov     ebp,lib_name
        call    @copypath
        popad }


Вернуться к началу
СообщениеДобавлено: Сб дек 01, 2018 1:19 pm 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1257
Если уж на то пошло, верх расточительства это то как написаны половина ядра и большинство программ.


Вернуться к началу
СообщениеДобавлено: Пн дек 03, 2018 12:41 am 
Не в сети

Зарегистрирован: Чт авг 04, 2016 10:43 am
Сообщения: 11
pseudologic is this:ой надо ж по русски... (привычка)
на время разработки пришлось добавить эту вспомогательную чушь - назвал temporary_notify, неоптимально но это гляделка для отладки и не более.
Код:
macro temporary_notify sz_string {
        pushad
        mov     esi, sz_string
        xchg    esi, [run_notify_struct.Flags]
        mcall   SF_FILE,run_notify_struct
        xchg    esi, [run_notify_struct.Flags]
        popad}

Код:
GetStrLength:
; string:                   [in]  edi
; string length:            [out] ecx
;                           [unchanged] ebx, edx, esi, edi, ebp, esp
        or      ecx, -1
        xor     eax, eax
        cld
        repne scasb
        not     ecx
        sub     edi,ecx
        ret

Код:
GetProcAddress:
; hInstance (export table): [in]  esi
; proc name:                [in]  edi
; proc address:             [out] eax
;                           [unchanged] ebp, esp
        call    GetStrLength
        mov     edx, ecx
        mov     ebx, edi
        mov     eax, esi
.import_find:
        mov     esi, ebx
        mov     edi, [eax]
        test    edi, edi
        jz      .import_not_found
        repe cmpsb
        je      .import_found
        mov     ecx, edx
        add     eax, 8
        jmp     .import_find
.import_not_found:
        sub     eax, 4
.import_found:
        mov     eax, [eax+4]
        ret

Код:
ResolveImports:
; hInstance (export table): [in]  esi
; lib.lookup table:         [in]  ebp
; ?isResolved:              [out] eax
;                           [unchanged] esi, esp
.retFrom = 4
        ;temporary_notify edx ;-success
.import_loop:
        mov     edi, [ebp]
        test    edi, edi
        jz      .import_done
        push    esi
        call    GetProcAddress
        pop     esi
        test    eax, eax
        jz      .import_not_found
        mov     [ebp],eax
        add     ebp,4
        jmp     .import_loop
.import_not_found:
        mov     eax, sz_EPnotFound
        mov     ebx, sizeof.sz_EPnotFound
        mov     ecx, 3
        mov     edx, [ebp]
        call    ShowErrorWindow
        or      [LoadLibraries.errStatus+ResolveImports.retFrom],1
        ;mcall   SF_TERMINATE_PROCESS ;uncomment to stop after 1st error
        jmp     .import_loop
.import_done:
        ret

Код:
@copy_path_wo_pdname:
; library name:             [in]  edx
; library path:             [in]  esi
; current directory path:   [in]  edi
;                           [out] no
;                           [unchanged] ebx, edx, ebp, esp
        call    GetStrLength
        add     edi,ecx
        mov     al, '/'
        std
        repne scasb
        cld
        sub     edi,ecx
        add     ecx,2
        xchg    esi, edi
        mov     eax, ecx
        shr     ecx, 2
        rep movsd
        mov     ecx, eax
        and     ecx, 3
        rep movsb
        ;cld
        ;add     edi,2
        mov     esi, edx
        xchg    esi, edi
        call    GetStrLength
        xchg    esi, edi
        mov     eax, ecx
        shr     ecx, 2
        rep movsd
        mov     ecx, eax
        and     ecx, 3
        rep movsb
        ret

Код:
LoadLibrary:
; library name:             [in]  edx
; hInstance (export table): [out] eax
;                           [unchanged] edx, ebp, esp
        mov     edi, cur_dir_path
        mov     esi, library_path
        call    @copy_path_wo_pdname
        ;temporary_notify library_path  ;-success
        mcall   SF_SYS_MISC,SSF_LOAD_DLL,library_path
        test    eax, eax
        jnz     .ret
        lea     ecx, [edx-9]
        mcall   SF_SYS_MISC,SSF_LOAD_DLL,[=]/ecx   ; load of sys directory
.ret
        ret

Код:
LoadLibraries:
; [in/out]    no
; [unchanged] esp
        push    0
        push    import.data
virtual at esp+4
  .errStatus dd ?
end virtual
.LoopLibraries:
        mov     eax, [esp]
        mov     ebp, [eax]
        test    ebp, ebp
        jz      .done
        mov     edx, [eax+4]
        call    LoadLibrary;edx=name
        test    eax, eax
        jz      .onError
        mov     esi,eax
        call    ResolveImports
        add     [esp],8
        jmp     .LoopLibraries
.onError:
        mov     eax, sz_cantLL
        mov     ebx, sizeof.sz_cantLL
        mov     ecx, 1
        ;mov     edx, edx
        call    ShowErrorWindow
        or      [LoadLibraries.errStatus],1
        ;mcall   SF_TERMINATE_PROCESS ;uncomment to stop after 1st error
        jmp     .LoopLibraries
.done:
        test    [LoadLibraries.errStatus],1
        jz      .exit
        mcall   SF_TERMINATE_PROCESS
.exit:
        add     esp,8
        ret

Код:
ShowErrorWindow:
; error string: [in] edx
;               [unchanged] edx, ebp, esp
        mov     edi, [run_notify_struct.Flags]
        xor     ecx, [rns.state]
        test    ecx, ecx
        jz      .rns.FlagsInited
        cmp     ecx, 2
        jz      .rns.FlagsPreInited
.rns.FlagsPreInit:
        mov     esi, sz_system_error
        mov     ecx, sizeof.sz_system_error-1
        cld
        rep movsb
        or      [rns.state],1
        jmp     .rns.FlagsInit
.rns.FlagsPreInited:
        add     edi, sizeof.sz_system_error-1
.rns.FlagsInit:
        mov     esi, eax
        xchg    esi, edi
        call    GetStrLength
        dec     ecx
        xchg    esi, edi
        rep movsb
        xor     [rns.state],2
        jmp     .rns.FlagsDone
.rns.FlagsInited:
        lea     edi, [edi+ebx-1+sizeof.sz_system_error-1]
.rns.FlagsDone:
        mov     esi, edx
        xchg    esi, edi
        call    GetStrLength
        xchg    esi, edi
        rep movsb
        mcall   SF_FILE,run_notify_struct
        ret


во всех вышеперечисленных процедурах вызывающая процедура сама ответственна за сохранение регистров, уничтожаемых вызываемой процедурой.

ну и сами макросы импорта (схожие с макросами для Win & Linux import):
Код:
macro library [name,string]
 { common
     import.data:
   forward
     local _label
     if defined name#.redundant
       if ~ name#.redundant
         dd name#.lookup,_label
       end if
     end if
     name#.referred = 1
   common
     dd 0
   forward
     if defined name#.redundant
       if ~ name#.redundant
         align 4
         db '/sys/lib/' ; thats why I substructs 9 from reg3 in pseudocode sizeof '/sys/lib/' = 9, от этого, конечно, потом надо будет избавиться и формировать сислибпуть динамически
         _label db string,0
       end if
     end if }
Код:
macro import name,[label,string]
 { common
     align 4
     if defined name#.referred
       name#.lookup:
       ;name#.redundant = 1
   forward
       if used label
         local _label
         label dd _label
       end if
   common
     if $ > name#.lookup
      name#.redundant = 0
      dd 0
     else
      name#.redundant = 1
     end if
   forward
       if used label
         align 4
         _label db string,0
       end if
   common
     end if }


Последний раз редактировалось ProMiNick Ср дек 05, 2018 3:18 am, всего редактировалось 3 раза.

Вернуться к началу
СообщениеДобавлено: Пн дек 03, 2018 3:28 pm 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1257
Слууушай... может ты уж сразу поддержку PE будешь делать? Доступ к SVN можно у админов попросить.


Вернуться к началу
СообщениеДобавлено: Пн дек 03, 2018 11:50 pm 
Не в сети

Зарегистрирован: Чт авг 04, 2016 10:43 am
Сообщения: 11
Pathoswithin, а она нужна? поддержка PE то?

и...
...сразу я буду делать только то, что я буду делать - а делать я буду инструмент (инструмент это fasm и "правильные" макросы).
Я хреновый программист (как я понимаю, я серьезно провисаю по строковым операциям) - тем арсеналом макросов, что есть сейчас, я не могу кодить что-то глобальное. PE то я знаю, а вот с объектными файлами грабли - пришлось верить на слово коду до меня, что загрузка объектной библиотеки загружает в хэндл сразу таблицу ее экспорта, а не какой-то заголовок перед ней.

Вообще, идея была довести макросы до ума (так чтобы колибри приложения максимально напоминали(но только напоминали, за счет макросов) по своей структуре Win & Linux) и привлечь к проекту John Found, адаптация fresh под колибри его давняя хотелка. И я с его хотелкой солидарен. мне фасм удобнее, чем фреш - а вот людей он(имею в виду фреш) привлечет в проект поиграться.


Вернуться к началу
СообщениеДобавлено: Вт дек 04, 2018 12:11 am 
Не в сети

Зарегистрирован: Пн мар 27, 2006 6:33 am
Сообщения: 641
ProMiNick писал(а):
...сразу я буду делать только то, что я буду делать - а делать я буду инструмент (инструмент это fasm и "правильные" макросы).

Есть вариант Fasm со встроенным в ядро Forth языком.
В качестве примера там - считывание Форт скрипта и прохода по внутренним меткам собираемого Asm файла
c генерацией выходного файла с именами и адресами меток.
На этапе сборки модифицированного Fasm собираются тоже внутренние метки самого кода Fasm для сборки результирующего файла c включённым Forth.

P.S. Есть ещё вариант вызова "сервиса" Fasm из Forth через fasm.dll
Эти проекты под Windows, но можно и для нативного использования сделать в самой KOS.


Вернуться к началу
СообщениеДобавлено: Вт дек 04, 2018 1:27 pm 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1257
ProMiNick
Что бы я ни делал, я не написал и не использовал ни одного макроса. Хорошие программисты пишут функции. Например, по строковым операциям вот http://websvn.kolibrios.org/filedetails ... string.inc


Вернуться к началу
СообщениеДобавлено: Вт дек 04, 2018 2:50 pm 
Не в сети

Зарегистрирован: Чт авг 04, 2016 10:43 am
Сообщения: 11
Про пример твоего кода - очень хороший стиль - все комментировано.

только вот, Pathoswithin, ай ай ай!
ты обманываешь: ты использовал макросы proc и endp.
Их то, как раз, я и не люблю, как не люблю HLL-ные .if, .switch, .case...

Я люблю свободно использовать ebp, а стандартный proc мне мешает в этом. переписать proc чтоб он обрабатывал локальные переменные через esp можно, но это затратно на ресурсах компилятора - поэтому я предпочитаю кодить без использования proc вообще.
Я люблю свободно использовать условные переходы не всегда обычным образом - HLL-ные макросы опять же ограничивают.
А вот макросов структурирования данных, и макросов повышения читабельности кода я поклонник.

П.С. макрос LoadLibrary я собираюсь заменить вызовом LoadLibrary, так что, я, как бы, тоже пишу код...

П.П.С. Это хорошие программисты пишут без макросов, но я же написал, что я то хреновый программист - макросы мне нужны.


Вернуться к началу
СообщениеДобавлено: Ср дек 05, 2018 1:17 am 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1257
Это не мой код, просто пример. Обычно я передавал параметры в регистрах. Хотя один раз я писал библиотеку, и таки да, немного использовал макросы http://websvn.kolibrios.org/filedetails ... rWorks.asm


Вернуться к началу
СообщениеДобавлено: Ср дек 05, 2018 3:15 pm 
Не в сети

Зарегистрирован: Чт авг 04, 2016 10:43 am
Сообщения: 11
https://yadi.sk/d/GCe4iJI0pg50cg - полные исходники по ссылке.
Отладил @copy_path_wo_pdname и LoadLibrary - из текущей папки также корректно обрабатывает загрузку как и из системной.
А вот с ResolveImports и GetProcAddress возникли затруднения:
- перед входом в ResolveImports в окно уведомлений уходит имя библиотеки:
Код:
...
        temporary_notify [eax+4]
        call    ResolveImports 

- в случае нахождения импортируемой функции процедурой GetProcAddress в окно уведомлений уходит имя функции:
Код:
...
.import_found:
        temporary_notify [eax]; [eax] как раз содержит имя функции

- в случае ненахождения импортируемой функции процедурой GetProcAddress функция ResolveImports запускает ShowErrorWindow:
Код:
.import_not_found:
        ...           
        mov     edx, [ebp]; [ebx] как раз содержит имя функции, а ShowErrorWindow принимает этот параметр в edx
        call    ShowErrorWindow

В общем смущает порядок следования уведомлений
Вложение:
notifies.jpg
notifies.jpg [ 185.56 КБ | 239 просмотров ]

Т.к. структура импорта вот такая:
Код:
library box_lib,'box_lib.obj',\
          proc_lib,'proc_lib.obj'
  import box_lib,edit_box_draw,'edit_box',\
                 edit_box_key,'edit_box_key',\
                 edit_box_mouse,'edit_box_mouse',\
                 edit_box_set_text,'edit_box_set_text',\
                 version_ed,'version_ed',\
                 init_checkbox,'init_checkbox2',\
                 check_box_draw,'check_box_draw2',\
                 check_box_mouse,'check_box_mouse2',\
                 version_ch,'version_ch'
  import proc_lib,OpenDialog_Init,'OpenDialog_Init',\
                  OpenDialog_Start,'OpenDialog_Start'


Есть в колибри что-нибудь, что выведет эти сообщения последовательно?

... ладно, не дождался ответа, придумал и добавил вот таких костылей в отладку
Код:
macro temporary_notify sz_string {
        local ..popad             
        pushad
        inc     [dbg_var]           ;ну и разместил эту переменную в коде инициализировав нулем.
        cmp     [dbg_var],1
        jb     ..popad
        cmp     [dbg_var],4      ;по одной было совсем бы тяжко
        ja     ..popad
        mov     esi, sz_string
        xchg    esi, [run_notify_struct.Flags]
        mcall   SF_FILE,run_notify_struct
        xchg    esi, [run_notify_struct.Flags]
..popad:
        popad}


Вернуться к началу
СообщениеДобавлено: Ср дек 05, 2018 5:22 pm 
Не в сети

Зарегистрирован: Вс авг 09, 2015 3:41 pm
Сообщения: 107
Цитата:
Есть в колибри что-нибудь, что выведет эти сообщения последовательно?
board
документация
любимые макросы


Вернуться к началу
СообщениеДобавлено: Пт дек 07, 2018 12:48 am 
Не в сети

Зарегистрирован: Чт авг 04, 2016 10:43 am
Сообщения: 11
Ray,
спасибо помогло, с кодом было все ок: просто одну букву не в том регистре написал - приложение таки запустилось.


Вложения:
board.JPG
board.JPG [ 44.47 КБ | 140 просмотров ]
Вернуться к началу
СообщениеДобавлено: Пт дек 07, 2018 1:08 am 
Не в сети

Зарегистрирован: Чт авг 04, 2016 10:43 am
Сообщения: 11
Нету в жизни счастья без несчастья. работает. запускается. компилит другую версию себя.
Вложение:
noLuck.JPG
noLuck.JPG [ 37.93 КБ | 137 просмотров ]
Но при попытке скомпилировать example.asm из /rd/1 - программа вылетает, также вылетает при пути /fd/1

ложная тревога - баг был в самой колибри, вернее в виртуальном образе оной. после восстановления на чистую колибри и подмены встроенной версии фасм - моей версией - все работает.
В багнутой колибри - оригинальный фасм писал write failed, а моя версия падала молча.
Не подскажете как сэмулировать состояние write failed для какого-нибудь файла.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 16 сообщений ]  На страницу 1 2 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB