Доброго времени суток, товарищи ассемблерщики. Пытаюсь написать простейшую dll'ку для mIRC на fasm'е с процедурой, возвращающей мирке строку 'hello'. Вот так делаю: Код (Text): format PE GUI 4.0 DLL include 'win32a.inc' string db 'Hello',0h len dd 6 proc hello mWnd, aWnd, data, parms, show, nopause mov ecx, 0 @loop: mov dl, [string+ecx] movsx edx, dl mov [data+ecx], edx inc ecx cmp ecx, [len] jl @loop mov eax, 3 ret endp section '.edata' data export readable writeable export 'libmemory.dll',\ hello, 'hello' а мирка неблагодарно мне высказывает, что $dll ничего не возвращает. Note: для тех, кто не в курсе, dll для мирки работают так, что процедура, вызываемая миркой возвращает 3, записав предварительно в память по адресу data строку, которая в последствие возвращается идентификатором $dll(путь,функция,) Есть такая рабчая функция на C: Код (Text): int __stdcall hello(HWND mWnd, HWND aWnd, char *data, char *parms, int show, int nopause) { strcpy(data, "Hello"); return 3; } Прошу помочь с dll-кой или грамотно перевести C'шную функцию на ассемблер(fasm). Заранее благодарю. =)
все, вроде разобрался. х_х сделал так: Код (Text): proc hello mWnd, aWnd, data, parms, show, nopause mov ecx, 0 mov ebx, [data] @loop: mov dl, [string+ecx] movsx edx, dl mov [ebx+ecx], edx inc ecx cmp ecx, [len] jl @loop mov eax, 3 ret endp и все заработало =) надо же...
Не знаю, как насчет mIRC, но 'mov [ebx+ecx], edx' смотрится не очень правильно, т.к. судя по прототипу data == char *, а пишется по этому адресу по четыре байта за раз. В результате можно промахнуться на три байта, записывая последний символ.
Ну да. Я уже поправил. Просто раньше пытался писать в [data+ecx], а там размер 4 байта, поэтому и писал edx. =)