Вопрос(ы) по internals(кишкам) Колибри

Applications development, KoOS API questions
  • ProMiNick wrote:3. process_information.wnd_state: что значит окно свернутое в заголовок? как перевести окно в это состояние не программно(т.е. через юзеринтерфейс: мышкой, клавиатурой, через меню)? вывести из него?
    Правый клик мыши на заголовке окна. Выглядит так: viewtopic.php?f=36&t=3784#p72291
  • Лицензионное соглашение:
    Все, что я публикую на страницах этого форума является собственностью всех пользователей семейства языков fasm, и на код и на макроинструкции распространяются те же свободы как если бы они были размещены на страницах board.flatassembler.net.
    То есть любой публикуемый мной код или макроконструкции на страницах этого форума является общенародным, любой вправе его использовать как строительные блоки для своих творений без каких либо указаний на мое авторство или на источник, а также любой вправе без ограничений указывать собственное авторство под совокупным кодом включающим мой код, или без ограничений причислять совокупный код как неотъемлемую часть ОС и накладывать на совокупный код право собственности и применять к этой ОС любые лицензии.

    предлагаю добавить в макросы macros.inc:

    Code: Select all

    macro movastr from
    { local ..move
            match [<],from {std\}
            match [>],from {cld\}
    ..move:
            lodsb
            stosb
            test    al,al
            jnz     ..move }

    Code: Select all

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

    Code: Select all

    macro seekrachar achar,from ;для случая когда строка в EDI
    {       match [<],from {std\}
            match [>],from {cld\}
            match any,achar {mov al,achar\}
            repne   scasb }
    данные макросы увеличили бы читаемость, скажем процедуры @copy_path макроса @use_library:

    Code: Select all

    @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)

    Code: Select all

    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 }
  • Если уж на то пошло, верх расточительства это то как написаны половина ядра и большинство программ.
  • pseudologic is this:ой надо ж по русски... (привычка)
    на время разработки пришлось добавить эту вспомогательную чушь - назвал temporary_notify, неоптимально но это гляделка для отладки и не более.

    Code: Select all

    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}

    Code: Select all

    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 

    Code: Select all

    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

    Code: Select all

    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

    Code: Select all

    @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

    Code: Select all

    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

    Code: Select all

    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

    Code: Select all

    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):

    Code: Select all

    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 }

    Code: Select all

    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 }
    Last edited by ProMiNick on Wed Dec 05, 2018 3:18 am, edited 3 times in total.
  • Слууушай... может ты уж сразу поддержку PE будешь делать? Доступ к SVN можно у админов попросить.
  • Pathoswithin, а она нужна? поддержка PE то?

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

    Вообще, идея была довести макросы до ума (так чтобы колибри приложения максимально напоминали(но только напоминали, за счет макросов) по своей структуре Win & Linux) и привлечь к проекту John Found, адаптация fresh под колибри его давняя хотелка. И я с его хотелкой солидарен. мне фасм удобнее, чем фреш - а вот людей он(имею в виду фреш) привлечет в проект поиграться.
  • ProMiNick wrote:...сразу я буду делать только то, что я буду делать - а делать я буду инструмент (инструмент это fasm и "правильные" макросы).
    Есть вариант Fasm со встроенным в ядро Forth языком.
    В качестве примера там - считывание Форт скрипта и прохода по внутренним меткам собираемого Asm файла
    c генерацией выходного файла с именами и адресами меток.
    На этапе сборки модифицированного Fasm собираются тоже внутренние метки самого кода Fasm для сборки результирующего файла c включённым Forth.

    P.S. Есть ещё вариант вызова "сервиса" Fasm из Forth через fasm.dll
    Эти проекты под Windows, но можно и для нативного использования сделать в самой KOS.
  • ProMiNick
    Что бы я ни делал, я не написал и не использовал ни одного макроса. Хорошие программисты пишут функции. Например, по строковым операциям вот http://websvn.kolibrios.org/filedetails ... string.inc
  • Про пример твоего кода - очень хороший стиль - все комментировано.

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

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

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

    П.П.С. Это хорошие программисты пишут без макросов, но я же написал, что я то хреновый программист - макросы мне нужны.
  • Это не мой код, просто пример. Обычно я передавал параметры в регистрах. Хотя один раз я писал библиотеку, и таки да, немного использовал макросы http://websvn.kolibrios.org/filedetails ... rWorks.asm
  • https://yadi.sk/d/GCe4iJI0pg50cg - полные исходники по ссылке.
    Отладил @copy_path_wo_pdname и LoadLibrary - из текущей папки также корректно обрабатывает загрузку как и из системной.
    А вот с ResolveImports и GetProcAddress возникли затруднения:
    - перед входом в ResolveImports в окно уведомлений уходит имя библиотеки:

    Code: Select all

    ...
            temporary_notify [eax+4]
            call    ResolveImports  

    - в случае нахождения импортируемой функции процедурой GetProcAddress в окно уведомлений уходит имя функции:

    Code: Select all

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

    Code: Select all

    .import_not_found:
            ...           
            mov     edx, [ebp]; [ebx] как раз содержит имя функции, а ShowErrorWindow принимает этот параметр в edx
            call    ShowErrorWindow
    В общем смущает порядок следования уведомлений
    notifies.jpg
    notifies.jpg (185.56 KiB)
    Viewed 12896 times
    Т.к. структура импорта вот такая:

    Code: Select all

    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'
    Есть в колибри что-нибудь, что выведет эти сообщения последовательно?

    ... ладно, не дождался ответа, придумал и добавил вот таких костылей в отладку

    Code: Select all

    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}
  • Есть в колибри что-нибудь, что выведет эти сообщения последовательно?
    board
    документация
    любимые макросы
  • Ray,
    спасибо помогло, с кодом было все ок: просто одну букву не в том регистре написал - приложение таки запустилось.
    Attachments
    board.JPG
    board.JPG (44.47 KiB)
    Viewed 12797 times
  • Нету в жизни счастья без несчастья. работает. запускается. компилит другую версию себя.
    noLuck.JPG
    noLuck.JPG (37.93 KiB)
    Viewed 12794 times
    Но при попытке скомпилировать example.asm из /rd/1 - программа вылетает, также вылетает при пути /fd/1

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

    Users browsing this forum: No registered users and 12 guests