Board.KolibriOS.org

Official KolibriOS board
It is currently Tue Jun 18, 2019 4:04 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 21 posts ]  Go to page 1 2 Next
Author Message
PostPosted: Wed Nov 28, 2018 4:06 am 
Offline

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

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


Top
   
PostPosted: Wed Nov 28, 2018 1:42 pm 
Offline

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


Top
   
PostPosted: Fri Nov 30, 2018 12:12 am 
Offline

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

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


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


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


данные макросы увеличили бы читаемость, скажем процедуры @copy_path макроса @use_library:
Code:
@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:
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 }


Top
   
PostPosted: Sat Dec 01, 2018 1:19 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1262
Если уж на то пошло, верх расточительства это то как написаны половина ядра и большинство программ.


Top
   
PostPosted: Mon Dec 03, 2018 12:41 am 
Offline

Joined: Thu Aug 04, 2016 10:43 am
Posts: 22
pseudologic is this:ой надо ж по русски... (привычка)
на время разработки пришлось добавить эту вспомогательную чушь - назвал temporary_notify, неоптимально но это гляделка для отладки и не более.
Code:
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:
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:
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:
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:
@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:
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:
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:
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:
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:
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.

Top
   
PostPosted: Mon Dec 03, 2018 3:28 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1262
Слууушай... может ты уж сразу поддержку PE будешь делать? Доступ к SVN можно у админов попросить.


Top
   
PostPosted: Mon Dec 03, 2018 11:50 pm 
Offline

Joined: Thu Aug 04, 2016 10:43 am
Posts: 22
Pathoswithin, а она нужна? поддержка PE то?

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

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


Top
   
PostPosted: Tue Dec 04, 2018 12:11 am 
Offline

Joined: Mon Mar 27, 2006 6:33 am
Posts: 659
ProMiNick wrote:
...сразу я буду делать только то, что я буду делать - а делать я буду инструмент (инструмент это fasm и "правильные" макросы).

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

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


Top
   
PostPosted: Tue Dec 04, 2018 1:27 pm 
Offline
Mentor/Kernel Developer
User avatar

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


Top
   
PostPosted: Tue Dec 04, 2018 2:50 pm 
Offline

Joined: Thu Aug 04, 2016 10:43 am
Posts: 22
Про пример твоего кода - очень хороший стиль - все комментировано.

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

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

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

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


Top
   
PostPosted: Wed Dec 05, 2018 1:17 am 
Offline
Mentor/Kernel Developer
User avatar

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


Top
   
PostPosted: Wed Dec 05, 2018 3:15 pm 
Offline

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

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

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

В общем смущает порядок следования уведомлений
Attachment:
notifies.jpg
notifies.jpg [ 185.56 KiB | Viewed 2165 times ]

Т.к. структура импорта вот такая:
Code:
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:
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}


Top
   
PostPosted: Wed Dec 05, 2018 5:22 pm 
Offline

Joined: Sun Aug 09, 2015 3:41 pm
Posts: 112
Quote:
Есть в колибри что-нибудь, что выведет эти сообщения последовательно?
board
документация
любимые макросы


Top
   
PostPosted: Fri Dec 07, 2018 12:48 am 
Offline

Joined: Thu Aug 04, 2016 10:43 am
Posts: 22
Ray,
спасибо помогло, с кодом было все ок: просто одну букву не в том регистре написал - приложение таки запустилось.


Attachments:
board.JPG
board.JPG [ 44.47 KiB | Viewed 2066 times ]
Top
   
PostPosted: Fri Dec 07, 2018 1:08 am 
Offline

Joined: Thu Aug 04, 2016 10:43 am
Posts: 22
Нету в жизни счастья без несчастья. работает. запускается. компилит другую версию себя.
Attachment:
noLuck.JPG
noLuck.JPG [ 37.93 KiB | Viewed 2063 times ]
Но при попытке скомпилировать example.asm из /rd/1 - программа вылетает, также вылетает при пути /fd/1

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


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 21 posts ]  Go to page 1 2 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 3 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:  
cron
Powered by phpBB® Forum Software © phpBB Limited