Посмотрел примеры ДЛЛ на ФАСМ. понятно все кроме одного - куда кидать вазвращаемое значение, в EAX ?? (API функции вроде в него пишуть)
То, что ты возвратишь системе в еах - это важно для системы. В твою программу это значение не вернётся при LoadLibrary, если ты про это.
После ret управление передаётся в kernel32, а уже потом обратно в программу. Включай отладчик и всё увидишь.
_vi_ ret ничего никуда не возвращает. ret просто делает pop eip и всё. Т.к. при этом значение аккумулятора и других регистров не меняется, их свободно можно использовать в качестве значения возврата. Обычно значения до 8 бит возвращаются в al, до 16 - в ax, до 32 - в eax, до 64 - в eax:edx, но никто не мешает использовать другие регистры, стек, глобальные переменные, флаги, изобретать собственные соглашения вызова и т.д. Короче, куда вы положите возвращаемое значение, там оно и будет лежать до востребования вызывающим кодом или пока кто-то другой его случайно или намеренно не перезапишет.
1) если речь о точке входа в DLL (DLLmain и т.д. и т.п.) то в eax, это уйдёт в систему, и в некотором эквиваленте(смысловом) ты получишь это значение от системы в результате LoadLibrary. 2) если о системных каллбэк функах то смотрим надлежащий прототип (дефолт в eax) 3) если это твоя собственная функа то суй туда куда хочешь (хоть в стэк (с оговорками конечно )) , главное не запутаться когда вызывать будешь... 3.1) если предпологаешь юзать либу на языке, кроме асма, смотри спецификации вызовов поддержываемых языком, выбирай и реализуй в соответствии... [rewrited] Опередили...
в самую точку... бинго ка говориться а язык то VB ))) и пишу я функцию memset как в сях , а возвращать она должна указатель на область памяти , почему не на ВБ сразу - а чтоб быстрее работало )) вот только что накатал, по ламерски но приятно )) Код (Text): format PE GUI 4.0 DLL entry DllEntryPoint include 'include\win32a.inc' section '.code' code readable executable proc DllEntryPoint hinstDLL,fdwReason,lpvReserved mov eax,TRUE ret endp proc memset s,c,n mov s, byte [c] mov cx, [n-1] loop_main: jcxz m mov s+1 , byte [c] jmp loop_main m: mov eax, s ret endp section '.edata' export data readable export 'fun.DLL',\ memset,'memset' section '.reloc' fixups data discardable
ну тога ещё могу сказать что для С под win32 макрос proc генерит то что в совмещении с объявляется как _stdcall наиболее частый вариант
_vi_ VB до 6й версии поддерживает исключительно stdcall (значение возвращается через eax, а стек должна чистить сама функция). Мой ImpLib SDK позволяет обойти это ограничение, но это отдельная тема из серии издевательств над линкером VB. Более новые версии поддерживают и другие соглашения.
_vi_ А у меня есть 4й, который вместе с первым оффисом распространялся под Windows 3.1. Так что не надо хвастаться
DDDD насмешил, респект посмотри код выше плз, венет он мне указатель или нет , хотя скомпилю и проверю D
Нууууу... Ты не пробовал это компилировать? Я бы не рискнул. В общем, так правильнее: Код (Text): mov al, BYTE [c] mov ecx, DWORD [n] mov edx, DWORD [s] jecxz loop_end loop_main: mov BYTE [edx], al inc edx dec ecx jnz loop_main loop_end: mov eax, DWORD [s] ret