From 4c444c11c97b1bf89fabb1711694ac08b6410189 Mon Sep 17 00:00:00 2001 From: IgorA Date: Tue, 8 Jun 2010 21:43:19 +0000 Subject: [PATCH] new macros '@use_library_mem mem_alloc,mem_free,mem_realloc,dll_load' in file 'load_lib.mac' git-svn-id: svn://kolibrios.org@1488 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../develop/libraries/box_lib/!readme.txt | 9 ++- .../develop/libraries/box_lib/load_lib.mac | 64 ++++++++++++++----- programs/other/planet_v/planet_v.asm | 5 +- 3 files changed, 57 insertions(+), 21 deletions(-) diff --git a/programs/develop/libraries/box_lib/!readme.txt b/programs/develop/libraries/box_lib/!readme.txt index dded8abe37..7c156dfeeb 100644 --- a/programs/develop/libraries/box_lib/!readme.txt +++ b/programs/develop/libraries/box_lib/!readme.txt @@ -200,9 +200,14 @@ er_message_found_lib, ihead_f_l, myimport, er_message_import, ihead_f_i jnz exit ;если не 0, то уходим. mov ebp, dword [ebp+ll_struc_size-8] - в ebp адрес начала. -Макорос @use_library +Макорос @use_library -Этот макрос представляет вызываемые процедуры, которые используются для работы групп макросов А и B. Данный макрос располагается в секции дата. Использование данного макроса обязательно. +Этот макрос представляет вызываемые процедуры, которые используются для работы групп макросов А и B. Данный макрос располагается в секции дата. Использование данного макроса нужно для загрузки библиотек но его можно заменять на @use_library_mem. + + +Макорос @use_library_mem mem_alloc,mem_free,mem_realloc,dll_load + +Этот макрос использует макрос @use_library, но в отличие от него он позволяет для функций с именами 'lib_init' задавать 4 параметра. В даных параметрах могут быть указатели на функции для работы с памятью, которые могут быть нужны для использования внутри библиотеки. Как я могу использовать макрос загрузки библиотеки/библиотек в своей программе? diff --git a/programs/develop/libraries/box_lib/load_lib.mac b/programs/develop/libraries/box_lib/load_lib.mac index f59fb04ef8..0c18430c5d 100644 --- a/programs/develop/libraries/box_lib/load_lib.mac +++ b/programs/develop/libraries/box_lib/load_lib.mac @@ -117,7 +117,8 @@ local lp local lp1 local correction local exit_ -;/equ + +library_fun_memory_alloc equ 0 ;не использовать в макросах проверку на функции 'lib_init' err_message1 equ dword [esp+8] head1 equ dword [esp+4] @@ -325,6 +326,16 @@ align 4 +macro @use_library_mem mem_alloc,mem_free,mem_realloc,dll_load +{ +@use_library +library_fun_memory_alloc equ mem_alloc +library_fun_memory_free equ mem_free +library_fun_memory_realloc equ mem_realloc +library_fun_dll_load equ dll_load +} + + macro sys_load_library library_name__, cur_dir_path__, library_path__, system_path__, err_message_found_lib__, head_f_l__, myimport, err_message_import__, head_f_i__,point_dir_name__ { local end_steep @@ -589,6 +600,9 @@ macro show_error_window err_message, head } +;входные параметры: +;eax - адрес библиотеки в памяти +;myimport - импортируемые функции macro import_boxlib myimport, err_message_import__, head_f_i__ { local import_loop @@ -605,40 +619,60 @@ local import_not_found mov edx, eax mov esi,myimport import_loop: - lodsd + lodsd ;mov eax,dword[esi] ;add esi,4 ;получаем в eax указатель на имя импортируемой функции test eax, eax - jz import_done - push edx + jz import_done ;если указатель на имя функции = 0 (в пользовательской программе) + push edx ;сохраняем начало библиотечных указателей на функции import_find: mov ebx, [ds:edx] test ebx, ebx - jz import_not_found - push eax + jz import_not_found ;если указатель на имя функции = 0 (в библиотеке) + push eax ;eax - указатель на имя экспортируемой функции (в пользовательской программе) lp: mov cl, [ds:eax] - cmp cl, [ds:ebx] - jnz import_find_next + cmp cl, [ds:ebx] ;сравниваем имена функций в библиотеке и в пользовательской программе + jnz import_find_next ;если названия не совпали test cl, cl - jz import_found + jz import_found ;если названия совпали, и уже конец строки (cl=0) inc eax inc ebx jmp lp import_find_next: pop eax - add edx, 8 + add edx, 8 ;8 = 4 байта указатель на название и 4 байта указатель на функцию jmp import_find import_found: - pop eax - mov eax, [ds:edx+4] - mov [esi-4], eax - pop edx + pop ebx ;востанавливаем указатель на имя функции (который был в eax) и освобождаем стек + mov eax, [ds:edx+4] ;eax = указатель на функцию (в библиотеке) + mov [esi-4], eax ;копируем указатель (на функцию) в программу, -4 ставим потому что esi было сдвинуто командой lodsd + pop edx ;устанавливаем edx на начало библиотечных функций +;--- проверяем совпадает ли имя экспортированной функции с 'lib_init' +if library_fun_memory_alloc eq 0 +else + cmp dword[ebx],'lib_' + jne import_loop + cmp dword[ebx+4],'init' + jne import_loop +;--- если имя функции совпало с 'lib_init' попадаем сюда + ;подключение функций для работы с памятью + ;push eax + ;call dll.Init + pushad + mov esi,eax + mov eax,library_fun_memory_alloc + mov ebx,library_fun_memory_free + mov ecx,library_fun_memory_realloc + mov edx,library_fun_dll_load + call dword esi + popad +end if jmp import_loop import_not_found: add esp,4 show_error_window err_message_import__, head_f_i__ ;show error message /create window jmp e.exit import_done: - xor eax,eax + xor eax,eax ;=0 все загрузилось удачно e.exit: ;--------------------------------------------------------------------- } diff --git a/programs/other/planet_v/planet_v.asm b/programs/other/planet_v/planet_v.asm index 48bc0262f5..b4e1896ba1 100644 --- a/programs/other/planet_v/planet_v.asm +++ b/programs/other/planet_v/planet_v.asm @@ -29,7 +29,7 @@ otst_panel_left equ 265 include 'tile_fun.inc' include 'pl_import.inc' - @use_library + @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc, dll.Load struct FileInfoBlock Function dd ? @@ -80,9 +80,6 @@ start: mcall -1 ;exit not correct @@: - stdcall dll.Init,dword[lib_init] - stdcall dll.Init,dword[lib_init_ini] - copy_path ini_name,sys_path,file_name,0x0 stdcall dword[ini_get_str],file_name,ini_sec,ini_k_cache,dword[edit1.text],dword[edit1.max],ini_def_cache stdcall [str_len],dword[edit1.text],dword[edit1.max]