Доброго дня уважаемые! Некоторое время писал на C, сейчас решил покодить на асм, выбрал FASM. Вопрос такой, написал я функцию реализующую md5(хотя грубо, но ладно не об этом), запихнул в каркас для DLL, вот чего получилось. Код (Text): format PE GUI 4.0 DLL entry DllEntryPoint include 'win32a.inc' A_INIT=0x67452301 B_INIT=0xefcdab89 C_INIT=0x98badcfe D_INIT=0x10325476 section '.text' code readable executable proc DllEntryPoint hinstDLL,fdwReason,lpvReserved mov eax,TRUE ret endp macro F X,Y,Z { mov eax,[X] and eax,[Y] mov edx,eax mov eax,[X] not eax and eax,[Z] or eax,edx } macro G X,Y,Z { mov eax,[X] and eax,[Z] mov edx,eax mov eax,[Z] not eax and eax,[Y] or eax,edx } macro H X,Y,Z { mov eax,[X] xor eax,[Y] xor eax,[Z] } macro I X,Y,Z { mov eax,[Z] not eax or eax,[X] xor eax,[Y] } macro RoundF a,b,c,d,x,s,ac { F b,c,d add eax,x add eax,ac add eax,[a] rol eax,s add eax,[b] mov [a],eax } macro RoundG a,b,c,d,x,s,ac { G b,c,d add eax,x add eax,ac add eax,[a] rol eax,s add eax,[b] mov [a],eax } macro RoundH a,b,c,d,x,s,ac { H b,c,d add eax,x add eax,ac add eax,[a] rol eax,s add eax,[b] mov [a],eax } macro RoundI a,b,c,d,x,s,ac { I b,c,d add eax,x add eax,ac add eax,[a] rol eax,s add eax,[b] mov [a],eax } proc md5s ucM:DWORD,len:BYTE, dig:DWORD locals dwMes dd 16 dup(0) ucLenMes dd 8 a dd 0 b dd 0 c dd 0 d dd 0 endl mov esi, [ucM] lea edi, [dwMes] xor ecx,ecx mov cl,[len] rep movsb mov [edi],dword 0x00000080 ;äîáàâëÿåì â êîíåö ñîîáùåíèÿ áèò ðàâíûé 1 xor eax,eax mov al,[len] ;äîáàâëÿåì â êîíåö ëîê. ìàññèâà ïðåäòàâëåíèå äëèíû ñîîáùåíèÿ mul [ucLenMes] mov [ucLenMes-8],eax mov [a],A_INIT mov [b],B_INIT mov [c],C_INIT mov [d],D_INIT RoundF a,b,c,d,[dwMes],7,0xd76aa478 RoundF d,a,b,c,[dwMes+4],12,0xe8c7b756 RoundF c,d,a,b,[dwMes+8],17,0x242070db RoundF b,c,d,a,[dwMes+12],22,0xc1bdceee RoundF a,b,c,d,[dwMes+16],7,0xf57c0faf RoundF d,a,b,c,[dwMes+20],12,0x4787c62a RoundF c,d,a,b,[dwMes+24],17,0xa8304613 RoundF b,c,d,a,[dwMes+28],22,0xfd469501 RoundF a,b,c,d,[dwMes+32],7,0x698098d8 RoundF d,a,b,c,[dwMes+36],12,0x8b44f7af RoundF c,d,a,b,[dwMes+40],17,0xffff5bb1 RoundF b,c,d,a,[dwMes+44],22,0x895cd7be RoundF a,b,c,d,[dwMes+48],7,0x6b901122 RoundF d,a,b,c,[dwMes+52],12,0xfd987193 RoundF c,d,a,b,[dwMes+56],17,0xa679438e RoundF b,c,d,a,[dwMes+60],22,0x49b40821 RoundG a,b,c,d,[dwMes+4],5,0xf61e2562 RoundG d,a,b,c,[dwMes+24],9,0xc040b340 RoundG c,d,a,b,[dwMes+44],14,0x265e5a51 RoundG b,c,d,a,[dwMes],20,0xe9b6c7aa RoundG a,b,c,d,[dwMes+20],5,0xd62f105d RoundG d,a,b,c,[dwMes+40],9,0x02441453 RoundG c,d,a,b,[dwMes+60],14,0xd8a1e681 RoundG b,c,d,a,[dwMes+16],20,0xe7d3fbc8 RoundG a,b,c,d,[dwMes+36],5,0x21e1cde6 RoundG d,a,b,c,[dwMes+56],9,0xc33707d6 RoundG c,d,a,b,[dwMes+12],14,0xf4d50d87 RoundG b,c,d,a,[dwMes+32],20,0x455a14ed RoundG a,b,c,d,[dwMes+52],5,0xa9e3e905 RoundG d,a,b,c,[dwMes+8],9,0xfcefa3f8 RoundG c,d,a,b,[dwMes+28],14,0x676f02d9 RoundG b,c,d,a,[dwMes+48],20,0x8d2a4c8a RoundH a,b,c,d,[dwMes+20],4,0xfffa3942 RoundH d,a,b,c,[dwMes+32],11,0x8771f681 RoundH c,d,a,b,[dwMes+44],16,0x6d9d6122 RoundH b,c,d,a,[dwMes+56],23,0xfde5380c RoundH a,b,c,d,[dwMes+4],4,0xa4beea44 RoundH d,a,b,c,[dwMes+16],11,0x4bdecfa9 RoundH c,d,a,b,[dwMes+28],16,0xf6bb4b60 RoundH b,c,d,a,[dwMes+40],23,0xbebfbc70 RoundH a,b,c,d,[dwMes+52],4,0x289b7ec6 RoundH d,a,b,c,[dwMes],11,0xeaa127fa RoundH c,d,a,b,[dwMes+12],16,0xd4ef3085 RoundH b,c,d,a,[dwMes+24],23,0x04881d05 RoundH a,b,c,d,[dwMes+32],4,0xd9d4d039 RoundH d,a,b,c,[dwMes+48],11,0xe6db99e5 RoundH c,d,a,b,[dwMes+60],16,0x1fa27cf8 RoundH b,c,d,a,[dwMes+8],23,0xc4ac5665 RoundI a,b,c,d,[dwMes],6,0xf4292244 RoundI d,a,b,c,[dwMes+28],10,0x432aff97 RoundI c,d,a,b,[dwMes+56],15,0xab9423a7 RoundI b,c,d,a,[dwMes+20],21,0xfc93a039 RoundI a,b,c,d,[dwMes+48],6,0x655b59c3 RoundI d,a,b,c,[dwMes+12],10,0x8f0ccc92 RoundI c,d,a,b,[dwMes+40],15,0xffeff47d RoundI b,c,d,a,[dwMes+4],21,0x85845dd1 RoundI a,b,c,d,[dwMes+32],6,0x6fa87e4f RoundI d,a,b,c,[dwMes+60],10,0xfe2ce6e0 RoundI c,d,a,b,[dwMes+24],15,0xa3014314 RoundI b,c,d,a,[dwMes+52],21,0x4e0811a1 RoundI a,b,c,d,[dwMes+16],6,0xf7537e82 RoundI d,a,b,c,[dwMes+44],10,0xbd3af235 RoundI c,d,a,b,[dwMes+8],15,0x2ad7d2bb RoundI b,c,d,a,[dwMes+32],21,0xeb86d391 add [a],A_INIT add [b],B_INIT add [c],C_INIT add [d],D_INIT lea esi, [a] mov edi, [dig] mov ecx,dword 0x4 rep movsd ret endp section '.edata' export data readable export 'md5.dll',\ md5s,'md5s' section '.reloc' fixups data discardable Получил md5.dll Теперь хочу пользовать эту dll из VC2008 пишу такой код Код (Text): typedef void (WINAPI* _md5s)(unsigned char *ms,unsigned char len,unsigned char *ret); ...... char cData[]="1234567"; unsigned char uc[16]={0}; HMODULE hDLL = LoadLibrary("md5.dll"); _md5s md5s = (_md5s)GetProcAddress(hDLL,"md5s"); md5s((unsigned char *)cData,7,uc); VC ругается, пишет Run-Time Check Failure #0 — The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention Я так понимаю проблема в передаче параметров, но решить ее не могу. Если кто-нибудь знает что надо делать, пожалуйсто напишите решение!
Есть подозрение, что дело не в стеке, а в том, что регистры esi/edi не сохраняются. Вызываемая ф-ия должна сохранять регистры ebp, ebx, esi, edi, также флаг направления цепочеченых команд.