Вообще-то если поставить параметр и не передавать его, то при stdcall должно быть нарушение стека при выходе из функции. А так, наличие и полное отсутствие локальных переменных и параметров отличаются генерацией стекового фрейма - push ebp и т.п. Если никаких переменных и параметров нет, то фрейм может не создаваться. Поэтому если в твоей процедуре затесалась левая запись в [esp], то при наличии фрейма она не затрет адрес возврата, а без фрейма - затрет со всеми вытекающими последствиями
то, что идет дисбаланс стека - ясно из высказывания о нормально отрабатывающем мессадж боксе в кнце процедуры. но что к нему привело? причин может быть несколько, как та, что высказал leo, так и например то, что функция может быть вызвана с меньшим кол-вом параметров, чем определена. или в функции идет вызов __cdecl функции через стандартный инвок.. без кода сказать точно довольно проблематично
собственно вот процедура: Код (Text): proc MainFirefox invoke RegOpenKeyEx, HKEY_LOCAL_MACHINE, firefoxSubKey, 0, KEY_READ, hFirefoxKey cmp eax, 2 je .close mov [firefoxInstallSize], 256 invoke RegQueryValueEx, [hFirefoxKey], firefoxKeyName, 0, 0, firefoxInstallPath, firefoxInstallSize cmp eax, 2 je .close invoke SetCurrentDirectory, firefoxInstallPath cmp eax, 0 je .close invoke LoadLibrary, dllNSS cmp eax, 0 je .close mov [hNSS], eax invoke GetProcAddress, [hNSS], pNSS_Init mov [NSS_Init], eax invoke GetProcAddress, [hNSS], pPK11_GetInternalKeySlot mov [PK11_GetInternalKeySlot], eax invoke GetProcAddress, [hNSS], pPK11_Authenticate mov [PK11_Authenticate], eax invoke GetProcAddress, [hNSS], pNSSBase64_DecodeBuffer mov [NSSBase64_DecodeBuffer], eax invoke GetProcAddress, [hNSS], pPK11SDR_Decrypt mov [PK11SDR_Decrypt], eax invoke GetProcAddress, [hNSS], pPK11_FreeSlot mov [PK11_FreeSlot], eax invoke GetProcAddress, [hNSS], pNSS_Shutdown mov [NSS_Shutdown], eax invoke LoadLibrary, dllSQLite cmp eax, 0 je .close mov [hSQLite], eax invoke GetProcAddress, [hSQLite], psqlite3_open mov [sqlite3_open], eax invoke GetProcAddress, [hSQLite], psqlite3_exec mov [sqlite3_exec], eax invoke GetProcAddress, [hSQLite], psqlite3_close mov [sqlite3_close], eax invoke SHGetSpecialFolderPath, 0, firefoxappDataPath, CSIDL_APPDATA, 0 invoke wsprintf, firefoxIniPath, firefoxIniMask, firefoxappDataPath sub ebx, ebx .theloop: invoke wsprintf, firefoxProfileName, firefoxappNumMask, ebx invoke GetPrivateProfileString, firefoxProfileName, firefoxKeyName, 0, firefoxProfileDirectory, 40, firefoxIniPath cmp eax, 0 je .close invoke wsprintf, firefoxProfilePath, firefoxProfileMask, firefoxappDataPath, firefoxProfileDirectory invoke SetCurrentDirectory, firefoxProfilePath invoke NSS_Init, firefoxProfilePath invoke PK11_GetInternalKeySlot mov [hKeySlot], eax invoke PK11_Authenticate, [hKeySlot], 1, 0 cinvoke sqlite3_open, firefoxDBFile, hSQLiteDB cinvoke sqlite3_exec, [hSQLiteDB], firefoxSQLCommand, CallBack, 0, 0 cinvoke sqlite3_close, [hSQLiteDB] invoke PK11_FreeSlot, [hKeySlot] invoke NSS_Shutdown inc ebx jmp .theloop .close: ret endp CallBack - вывод в msgbox значений. она работает нормально)
wsprintf - cdecl, также cdecl возможно динамически находимые функции. тобешь вызывать надо не через invoke, а через cinvoke