Вытащил откуда не помню проц-у для кодирования Base 64. Давно ею пользуюсь и считал что все ок пока не мне не понадобилось возвращать последнее значение EDI Я заношу его значение в EAX (строчка в коде помеченая ; Return the address of last byte) НО до этого места проц-а не доходит !!!! Несмотря на то что я сохраняю в стэке еще регистры (push esi edi edx ebx), на момент возврата стэк корректен - проц-а возвращается в точку вызова основной программы Причем возврат происходит не там где я ожидал, а в другом месте (помечено ; ВОЗВРАТ ПРОИСХОДИТ ЗДЕСЬ ) Причем в коде нигде не производится операции со стеком! Что за чудеса ? Бьюсь целый день, никаких мыслей Заранее спасибо за разъяснение. Код (Text): ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; base64 encoder without dictionary by RT Fishel ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ proc Base64Encode lpSrc, lpDst, dwstrlen push esi edi edx ebx mov esi, [lpSrc] mov edi, [lpDst] mov ebx, dword [dwstrlen] call b64.encode ; Return the address of last byte mov eax, edi pop ebx edx edi esi ret b64: .newline: call b64.store_crlf .encode: push (76 shr 2) + 1 pop edx .outer: dec edx je b64.newline lodsd dec esi inc ebx bswap eax mov ecx, 4 .inner: rol eax, 6 and al, 3Fh cmp al, 3Eh jb b64.testchar shl al, 2 sub al, ((3Eh shl 2) + 'A' - '+') and 0FFh .testchar: sub al, 4 cmp al, '0' jnl b64.store add al, 'A' + 4 cmp al, 'Z' jbe b64.store add al, 'a' - 'Z' - 1 .store: stosb dec ebx loopne b64.inner jne b64.outer mov al, '=' rep stosb xor al, al stosb ; ВОЗВРАТ ПРОИСХОДИТ ЗДЕСЬ ret .store_crlf: mov ax, 0a0dh stosw ret endp
proc/endp говорят компилятору, что все, что между ними - одна процедура. Причём у неё есть 3 параметра, так что компилятор неявно генерирует код пролога и эпилога: в начале push ebp/mov ebp,esp и перед каждым ret вставляет leave (или mov esp,ebp/pop ebp, в данном контексте неважно) и, возможно, заменяет ret на ret 12 (если модель вызова stdcall). Соответственно первый же ret приводит к выходу из всей процедуры, а не возврат из call b64. P.S. Компилятор, судя по конструкциям, FASM? Тогда работу выполняет не сам компилятор, а proc/endp - макросы, исходный код которых даже можно посмотреть.
Видимо ты попался в сети убого масмодобия Попробуй заменить все ret после b64 на retn или оформи b64 в виде proc