Page 1 of 2

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

Posted: Wed Nov 28, 2018 4:06 am
by ProMiNick
1. SF_SET_EVENTS_MASK - Гарантирует ли, что SF_WAIT_EVENT вернет в eax строго определенный набор значений? (или, как говорится, нужен 2й jmp на случай, если 1й jmp не сработает?)
2. Если приложение имеет конечное число кнопок можно ли их обрабатывать через jmptable без проверки границ? или впоследствии кто-то чего-то может дописать - своеобразую инъекцию общесистемных дополнительных кнопок, которые окажутся не учтены в конечной таблице jmptable?
3. process_information.wnd_state: что значит окно свернутое в заголовок? как перевести окно в это состояние не программно(т.е. через юзеринтерфейс: мышкой, клавиатурой, через меню)? вывести из него?
продолжение следует...
На первый и второй вопросы принял допущение, что "да". Но решил спросить... на всякий.

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

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

Posted: Wed Nov 28, 2018 1:42 pm
by b00bl1k
ProMiNick wrote:3. process_information.wnd_state: что значит окно свернутое в заголовок? как перевести окно в это состояние не программно(т.е. через юзеринтерфейс: мышкой, клавиатурой, через меню)? вывести из него?
Правый клик мыши на заголовке окна. Выглядит так: viewtopic.php?f=36&t=3784#p72291

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

Posted: Fri Nov 30, 2018 12:12 am
by ProMiNick
Лицензионное соглашение:
Все, что я публикую на страницах этого форума является собственностью всех пользователей семейства языков 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 }

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

Posted: Sat Dec 01, 2018 1:19 pm
by Pathoswithin
Если уж на то пошло, верх расточительства это то как написаны половина ядра и большинство программ.

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

Posted: Mon Dec 03, 2018 12:41 am
by ProMiNick
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 }

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

Posted: Mon Dec 03, 2018 3:28 pm
by Pathoswithin
Слууушай... может ты уж сразу поддержку PE будешь делать? Доступ к SVN можно у админов попросить.

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

Posted: Mon Dec 03, 2018 11:50 pm
by ProMiNick
Pathoswithin, а она нужна? поддержка PE то?

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

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

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

Posted: Tue Dec 04, 2018 12:11 am
by Kopa
ProMiNick wrote:...сразу я буду делать только то, что я буду делать - а делать я буду инструмент (инструмент это fasm и "правильные" макросы).
Есть вариант Fasm со встроенным в ядро Forth языком.
В качестве примера там - считывание Форт скрипта и прохода по внутренним меткам собираемого Asm файла
c генерацией выходного файла с именами и адресами меток.
На этапе сборки модифицированного Fasm собираются тоже внутренние метки самого кода Fasm для сборки результирующего файла c включённым Forth.

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

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

Posted: Tue Dec 04, 2018 1:27 pm
by Pathoswithin
ProMiNick
Что бы я ни делал, я не написал и не использовал ни одного макроса. Хорошие программисты пишут функции. Например, по строковым операциям вот http://websvn.kolibrios.org/filedetails ... string.inc

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

Posted: Tue Dec 04, 2018 2:50 pm
by ProMiNick
Про пример твоего кода - очень хороший стиль - все комментировано.

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

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

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

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

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

Posted: Wed Dec 05, 2018 1:17 am
by Pathoswithin
Это не мой код, просто пример. Обычно я передавал параметры в регистрах. Хотя один раз я писал библиотеку, и таки да, немного использовал макросы http://websvn.kolibrios.org/filedetails ... rWorks.asm

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

Posted: Wed Dec 05, 2018 3:15 pm
by ProMiNick
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 12917 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}

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

Posted: Wed Dec 05, 2018 5:22 pm
by Ray
Есть в колибри что-нибудь, что выведет эти сообщения последовательно?
board
документация
любимые макросы

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

Posted: Fri Dec 07, 2018 12:48 am
by ProMiNick
Ray,
спасибо помогло, с кодом было все ок: просто одну букву не в том регистре написал - приложение таки запустилось.

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

Posted: Fri Dec 07, 2018 1:08 am
by ProMiNick
Нету в жизни счастья без несчастья. работает. запускается. компилит другую версию себя.
noLuck.JPG
noLuck.JPG (37.93 KiB)
Viewed 12815 times
Но при попытке скомпилировать example.asm из /rd/1 - программа вылетает, также вылетает при пути /fd/1

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