1. SF_SET_EVENTS_MASK - Гарантирует ли, что SF_WAIT_EVENT вернет в eax строго определенный набор значений? (или, как говорится, нужен 2й jmp на случай, если 1й jmp не сработает?)
2. Если приложение имеет конечное число кнопок можно ли их обрабатывать через jmptable без проверки границ? или впоследствии кто-то чего-то может дописать - своеобразую инъекцию общесистемных дополнительных кнопок, которые окажутся не учтены в конечной таблице jmptable?
3. process_information.wnd_state: что значит окно свернутое в заголовок? как перевести окно в это состояние не программно(т.е. через юзеринтерфейс: мышкой, клавиатурой, через меню)? вывести из него?
продолжение следует...
На первый и второй вопросы принял допущение, что "да". Но решил спросить... на всякий.
П.С. если тема размещена не корректно - перенесите тему.
Вопрос(ы) по internals(кишкам) Колибри
Правый клик мыши на заголовке окна. Выглядит так: viewtopic.php?f=36&t=3784#p72291ProMiNick wrote:3. process_information.wnd_state: что значит окно свернутое в заголовок? как перевести окно в это состояние не программно(т.е. через юзеринтерфейс: мышкой, клавиатурой, через меню)? вывести из него?
Лицензионное соглашение:
Все, что я публикую на страницах этого форума является собственностью всех пользователей семейства языков fasm, и на код и на макроинструкции распространяются те же свободы как если бы они были размещены на страницах board.flatassembler.net.
То есть любой публикуемый мной код или макроконструкции на страницах этого форума является общенародным, любой вправе его использовать как строительные блоки для своих творений без каких либо указаний на мое авторство или на источник, а также любой вправе без ограничений указывать собственное авторство под совокупным кодом включающим мой код, или без ограничений причислять совокупный код как неотъемлемую часть ОС и накладывать на совокупный код право собственности и применять к этой ОС любые лицензии.
предлагаю добавить в макросы macros.inc:
данные макросы увеличили бы читаемость, скажем процедуры @copy_path макроса @use_library:
И раз уж мы пихаем в стек ВСЕ РЕГИСТРЫ!!! Использовать после этого для 4х параметров стек вместо полностью свободных регистров - верх расточительства.(facepalm)
Все, что я публикую на страницах этого форума является собственностью всех пользователей семейства языков 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 }
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
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, неоптимально но это гляделка для отладки и не более.
во всех вышеперечисленных процедурах вызывающая процедура сама ответственна за сохранение регистров, уничтожаемых вызываемой процедурой.
ну и сами макросы импорта (схожие с макросами для Win & Linux import):
на время разработки пришлось добавить эту вспомогательную чушь - назвал 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 под колибри его давняя хотелка. И я с его хотелкой солидарен. мне фасм удобнее, чем фреш - а вот людей он(имею в виду фреш) привлечет в проект поиграться.
и...
...сразу я буду делать только то, что я буду делать - а делать я буду инструмент (инструмент это fasm и "правильные" макросы).
Я хреновый программист (как я понимаю, я серьезно провисаю по строковым операциям) - тем арсеналом макросов, что есть сейчас, я не могу кодить что-то глобальное. PE то я знаю, а вот с объектными файлами грабли - пришлось верить на слово коду до меня, что загрузка объектной библиотеки загружает в хэндл сразу таблицу ее экспорта, а не какой-то заголовок перед ней.
Вообще, идея была довести макросы до ума (так чтобы колибри приложения максимально напоминали(но только напоминали, за счет макросов) по своей структуре Win & Linux) и привлечь к проекту John Found, адаптация fresh под колибри его давняя хотелка. И я с его хотелкой солидарен. мне фасм удобнее, чем фреш - а вот людей он(имею в виду фреш) привлечет в проект поиграться.
Есть вариант Fasm со встроенным в ядро Forth языком.ProMiNick wrote:...сразу я буду делать только то, что я буду делать - а делать я буду инструмент (инструмент это fasm и "правильные" макросы).
В качестве примера там - считывание Форт скрипта и прохода по внутренним меткам собираемого Asm файла
c генерацией выходного файла с именами и адресами меток.
На этапе сборки модифицированного Fasm собираются тоже внутренние метки самого кода Fasm для сборки результирующего файла c включённым Forth.
P.S. Есть ещё вариант вызова "сервиса" Fasm из Forth через fasm.dll
Эти проекты под Windows, но можно и для нативного использования сделать в самой KOS.
ProMiNick
Что бы я ни делал, я не написал и не использовал ни одного макроса. Хорошие программисты пишут функции. Например, по строковым операциям вот http://websvn.kolibrios.org/filedetails ... string.inc
Что бы я ни делал, я не написал и не использовал ни одного макроса. Хорошие программисты пишут функции. Например, по строковым операциям вот http://websvn.kolibrios.org/filedetails ... string.inc
Про пример твоего кода - очень хороший стиль - все комментировано.
только вот, Pathoswithin, ай ай ай!
ты обманываешь: ты использовал макросы proc и endp.
Их то, как раз, я и не люблю, как не люблю HLL-ные .if, .switch, .case...
Я люблю свободно использовать ebp, а стандартный proc мне мешает в этом. переписать proc чтоб он обрабатывал локальные переменные через esp можно, но это затратно на ресурсах компилятора - поэтому я предпочитаю кодить без использования proc вообще.
Я люблю свободно использовать условные переходы не всегда обычным образом - HLL-ные макросы опять же ограничивают.
А вот макросов структурирования данных, и макросов повышения читабельности кода я поклонник.
П.С. макрос LoadLibrary я собираюсь заменить вызовом LoadLibrary, так что, я, как бы, тоже пишу код...
П.П.С. Это хорошие программисты пишут без макросов, но я же написал, что я то хреновый программист - макросы мне нужны.
только вот, 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 в окно уведомлений уходит имя библиотеки:
- в случае нахождения импортируемой функции процедурой GetProcAddress в окно уведомлений уходит имя функции:
- в случае ненахождения импортируемой функции процедурой GetProcAddress функция ResolveImports запускает ShowErrorWindow:
В общем смущает порядок следования уведомлений
Т.к. структура импорта вот такая:
Есть в колибри что-нибудь, что выведет эти сообщения последовательно?
... ладно, не дождался ответа, придумал и добавил вот таких костылей в отладку
Отладил @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] как раз содержит имя функции
Code: Select all
.import_not_found:
...
mov edx, [ebp]; [ebx] как раз содержит имя функции, а ShowErrorWindow принимает этот параметр в edx
call ShowErrorWindow
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 (44.47 KiB)Viewed 13413 times
-
Нету в жизни счастья без несчастья. работает. запускается. компилит другую версию себя.
ложная тревога - баг был в самой колибри, вернее в виртуальном образе оной. после восстановления на чистую колибри и подмены встроенной версии фасм - моей версией - все работает.
В багнутой колибри - оригинальный фасм писал write failed, а моя версия падала молча.
Не подскажете как сэмулировать состояние write failed для какого-нибудь файла.
Но при попытке скомпилировать example.asm из /rd/1 - программа вылетает, также вылетает при пути /fd/1ложная тревога - баг был в самой колибри, вернее в виртуальном образе оной. после восстановления на чистую колибри и подмены встроенной версии фасм - моей версией - все работает.
В багнутой колибри - оригинальный фасм писал write failed, а моя версия падала молча.
Не подскажете как сэмулировать состояние write failed для какого-нибудь файла.
Who is online
Users browsing this forum: No registered users and 0 guests