DLL для mIRC

Тема в разделе "WASM.BEGINNERS", создана пользователем dimedrol_tab, 4 фев 2010.

  1. dimedrol_tab

    dimedrol_tab New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2010
    Сообщения:
    3
    Доброго времени суток, товарищи ассемблерщики.
    Пытаюсь написать простейшую dll'ку для mIRC на fasm'е с процедурой, возвращающей мирке строку 'hello'. Вот так делаю:
    Код (Text):
    1. format PE GUI 4.0 DLL
    2. include 'win32a.inc'
    3.  
    4. string db 'Hello',0h
    5. len    dd 6
    6.  
    7. proc hello mWnd, aWnd, data, parms, show, nopause
    8.      mov ecx, 0
    9.    @loop:
    10.      mov dl, [string+ecx]
    11.      movsx edx, dl
    12.      mov [data+ecx], edx
    13.      inc ecx
    14.      cmp ecx, [len]
    15.      jl @loop
    16.      mov eax, 3
    17.      ret
    18. endp
    19.  
    20. section '.edata' data export readable writeable
    21.         export 'libmemory.dll',\
    22.                hello, 'hello'
    а мирка неблагодарно мне высказывает, что $dll ничего не возвращает.
    Note: для тех, кто не в курсе, dll для мирки работают так, что процедура, вызываемая миркой возвращает 3, записав предварительно в память по адресу data строку, которая в последствие возвращается идентификатором $dll(путь,функция,)

    Есть такая рабчая функция на C:
    Код (Text):
    1. int __stdcall hello(HWND mWnd, HWND aWnd, char *data, char *parms, int show, int nopause)
    2. {
    3.     strcpy(data, "Hello");
    4.     return 3;
    5. }
    Прошу помочь с dll-кой или грамотно перевести C'шную функцию на ассемблер(fasm). Заранее благодарю. =)
     
  2. dimedrol_tab

    dimedrol_tab New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2010
    Сообщения:
    3
    все, вроде разобрался. х_х
    сделал так:
    Код (Text):
    1. proc hello mWnd, aWnd, data, parms, show, nopause
    2.      mov ecx, 0
    3.      mov ebx, [data]
    4.    @loop:
    5.      mov dl, [string+ecx]
    6.      movsx edx, dl
    7.      mov [ebx+ecx], edx
    8.      inc ecx
    9.      cmp ecx, [len]
    10.      jl @loop
    11.      mov eax, 3
    12.      ret
    13. endp
    и все заработало =) надо же...
     
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Не знаю, как насчет mIRC, но 'mov [ebx+ecx], edx' смотрится не очень правильно, т.к. судя по прототипу data == char *, а пишется по этому адресу по четыре байта за раз. В результате можно промахнуться на три байта, записывая последний символ.
     
  4. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    dimedrol_tab
    movsx edx, dl
    это тоже смотрится замечательно. особенно для char*
     
  5. dimedrol_tab

    dimedrol_tab New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2010
    Сообщения:
    3
    Ну да. Я уже поправил. Просто раньше пытался писать в [data+ecx], а там размер 4 байта, поэтому и писал edx. =)