Board.KolibriOS.org

Official KolibriOS board
It is currently Mon Sep 28, 2020 12:19 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 216 posts ]  Go to page Previous 111 12 13 14 15 Next
Author Message
 Post subject:
PostPosted: Sun Jan 07, 2007 6:57 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
maxxx

Для программ в примере testcon2.asm есть функции link и get_proc. Проще и быстрее включить их код в программу чем делать системный вызов. Особенно с фунцией link которая сама делает всё необходимое связывание. get_proc нужна только если требуется адрес конкретной функции.


Top
   
 Post subject:
PostPosted: Sun Jan 07, 2007 7:48 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Чтобы не возиться с ассемблерными вставками надо объявить все импортируемые функции через указатели

Code:
//это вариант для MSVC

extern void (_stdcall *dll_start)(int);
extern void (_stdcall *con_init)(dword wnd_width, dword wnd_height,
       dword scr_width, dword scr_height, const char* title)
extern void (_stdcall *con_write_asciiz)(dword flags, const char* string);

if( !dll_start(DLL_ENTRY))
{

//что-то не так

  exit();

}

в asm файле

Code:
imports:
_dll_start          dd szStart
_dll_ver            dd szVersion
_con_init           dd szcon_init
_con_write_asciiz   dd szcon_write_asciiz
_con_printf         dd szcon_printf
_con_exit           dd szcon_exit
                    dd 0                //завершает массив

szStart             db 'START',0
szVersion           db 'version',0
szcon_init          db 'con_init',0
szcon_write_asciiz  db 'con_write_asciiz',0
szcon_printf        db 'con_printf',0
szcon_exit          db 'con_exit',0

я не знаю если способ создать массив imports на C. Вероятно потребуется очень громоздкое приведение типов из указателя на строку в указатель на функцию если оно вообще возможно.


Top
   
 Post subject:
PostPosted: Sun Jan 07, 2007 9:28 pm 
Serge wrote:
maxxx

Для программ в примере testcon2.asm есть функции link и get_proc. Проще и быстрее включить их код в программу чем делать системный вызов. Особенно с фунцией link которая сама делает всё необходимое связывание. get_proc нужна только если требуется адрес конкретной функции.


для разработчика будет проще вызвать загрузку dll которая уже реализована в ядре, и вызвать функцию загрузки как массива импортируемых функций, так и отдельную функцию.

в любом случае в ядре уже реализованы как get_proc (одна функция), так и get_proc_ex (массив), так зачем прикладному программисту каждый раз включать в свой код процедуру get_proc/ex если можно их сделать доступными?

ядро должно предоставлять не только загрузку длл но и получение адреса функции из длл обеих версий посредством системных вызовов. лишний раз городить код в программе неразумно, если есть его аналоги в ядре


Top
   
 Post subject:
PostPosted: Tue Jan 09, 2007 12:14 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
maxxx

get_proc из ядра не годится для приложений. У ядра базовый адрес сегментов 0 а у программ std_application_base_address. Всё равно придется делать новую функцию и учитывать это смещение. Лучше разработать новый вариант заголовка, чтобы загрузчик мог сам загружать DLL и делать связывание.


Top
   
 Post subject:
PostPosted: Tue Jan 09, 2007 4:40 am 
Quote:
Всё равно придется делать новую функцию и учитывать это смещение. Лучше разработать новый вариант заголовка, чтобы загрузчик мог сам загружать DLL и делать связывание.

...было бы просто замечательно :)


Top
   
 Post subject:
PostPosted: Fri Feb 02, 2007 9:12 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
У меня вопрос по DLL.Как выделять в DLL память под стек ?

Я пишу одну DLL-ку.Она работает,если не передавать параметров через стек.А если передавать параметры через стек,то DLL не работает(глюки всякие появляются).


Top
   
 Post subject:
PostPosted: Fri Feb 02, 2007 10:19 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
andrew_programmer
ДЛЛ использует стек программы, так что ничего не надо выделять. Проверь передачу параметров и очистку стека после вызова, ещё лучше использовать макросы из proc32.inc ( proс, stdcall и т.д) примеры есть в исходниках ядра core/dll core/heap


Top
   
 Post subject:
PostPosted: Fri Feb 02, 2007 11:49 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Вот пример DLL:
Code:
format MS COFF

public EXPORTS

section '.flat' code readable align 16

align 4
test_dll:

      pop [v2]
      pop [v1]

      mov eax,13
      mov ebx,20*65536+100
      mov ecx,50*65536+100
      mov edx,0xffffff
      int 0x40

      ret

align 16
EXPORTS:
      dd szTest,test_dll
      dd 0

szTest      db 'test_dll',0


section '.data' data readable writable align 16

v1     rd 1
v2     rd 1

А вот программа,загружающая эту DLL:
Code:
use32
   db   'MENUET01'
   dd   1
   dd   start
   dd   i_end
   dd   0x1000
   dd   0x1000
   dd   0
   dd   0

start:
   call draw_window

   mov   eax, 68
   mov   ebx, 19
   mov   ecx, dll_name
   int   0x40
   test   eax,eax
   jz   exit

   mov ebx,[eax+4]
   mov [test_dll],ebx

        push 1
        push 2

   call [test_dll]

   mov eax,5
   mov ebx,200
   int 0x40


exit:
   or   eax, -1
   int   0x40

draw_window:

   mov eax,12
   mov ebx,1
   int 0x40

   xor eax,eax
   mov ebx,100*65536+300
   mov ecx,100*65536+300
   mov edx,0x03aabbcc
   int 0x40

   mov eax,12
   mov eax,2
   int 0x40

   ret

;DATA
dll_name db '/hd2/1/KOLIBRI/develop/testdll/dll',0

align 4
test_dll dd 0

i_end:

Код простой,но не работает.Почему - я незнаю.


Top
   
 Post subject:
PostPosted: Sat Feb 03, 2007 5:39 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
andrew_programmer
Не забывай что call записывает в стек адрес возврата

pop [v2] загрузит из стека адрес возврата
pop [v1] загрузит 2

ret загрузит 1 и запишет ее в eip

замени код на

mov eax, [esp+4] ;2
mov ebx, [esp+8], 1

mov [v1], ebx
mov [v2], eax

ret замени на ret 8
или после вызова функции добавь add esp,8
иначе будет разрушен стек

ещё раз рекомендую макросы из proc32.inc с их помощью можно создавать в стеке локальные переменные, что очень удобно.


Top
   
 Post subject:
PostPosted: Sat Feb 03, 2007 12:08 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Serge

Большое спасибо за совет.


Top
   
 Post subject:
PostPosted: Tue May 29, 2007 11:14 am 
При написании DLL уже можно использовать Fast System Call's?


Top
   
 Post subject:
PostPosted: Tue May 29, 2007 10:13 pm 
Offline
Kernel Developer
User avatar

Joined: Mon Mar 20, 2006 10:44 am
Posts: 558
Да запросто


Top
   
 Post subject:
PostPosted: Fri Jun 08, 2007 11:20 am 
Offline
User avatar

Joined: Fri May 18, 2007 11:11 pm
Posts: 125
Я не понял а на SVNе лежат исходники DLLей которые есть в дистре или нет? Я чтото найти не могу.


Top
   
 Post subject:
PostPosted: Sat Jun 09, 2007 11:25 am 
Offline
Site Founder
User avatar

Joined: Sun Aug 08, 2004 8:55 am
Posts: 690
Alver
На SVN их пока что нет, но я думаю исправить эту ситуацию. Просто, это был как бы эксперимент, и я не знал, во что он выльется :)
Сейчас их можно взять на мойм сайте: (7z|zip)


Top
   
PostPosted: Thu Oct 09, 2008 11:16 pm 
Offline
User avatar

Joined: Thu Oct 09, 2008 10:29 pm
Posts: 3
Здравствуйте!
Будет ли такой DLL код работать?

Code:
format MS COFF
public EXPORTS

section '.flat' code readable align 16

_ADDNumbers@8:
push ebp
mov ebp, esp
sub esp, 4
mov dword  [ebp-4], 0
mov eax, 100
mov dword  [_A], eax
mov eax, dword  [ebp+12]
add eax, dword  [ebp+8]
mov dword  [ebp-4], eax
mov eax, dword  [ebp-4]
mov esp, ebp
pop ebp
ret 8

align 16
EXPORTS:
dd    szADDNumbers@8,_ADDNumbers@8
db   0,0

szADDNumbers@8   db  'ADDNumbers@8',0

section '.bss' data readable writable
align 4
        _A:   rb 4
        _C:   rb 8
        _B:   rb 12
        _D:   rb  8

section '.data' data readable writable
align 4
_Lt_0007:       db      "Hello",0
_Lt_0008:       dq      32768
_Lt_000B:       db      "Hello World!",0


И ещё пару вопросов, о DLL.

Импортируемые функции - Должны обязательно находится в секции '.flat' или его можно вписать в секцию '.data' или так:
Code:
section '.export' data readable writable
EXPORTS:
dd    szADDNumbers@8,_ADDNumbers@8
db   0,0

szADDNumbers@8   db  'ADDNumbers@8',0

Заранее, спасибо!


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 216 posts ]  Go to page Previous 111 12 13 14 15 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


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:  
Powered by phpBB® Forum Software © phpBB Limited