.386
.model flat,stdcall
option casemap:none

.CODE
; =========================================================
; Во входной строке выделяется подстрока, содержащая только
; валидные символы, согласно спецификации Base64. Валидными
; считаются печатные символы из следующего множества:
; {'+'} & ['/', '9'] & {'='} & ['A', 'Z'] & ['a', 'z']
; ---------------------------------------------------------
; Параметры:
;  ESI - Указатель на входную строку, оканчивающуюся нулём.
;  EDI - Указатель на буфер для выходной строки.
;  (Регистры EAX, EDX и ECX не сохраняются!)
; =========================================================
_b64_trim PROC SYSCALL
@@:  mov al,[esi]
     inc esi
     test al,al
     jz @R
     call @isValidChar
     jz @B
@@:  mov [edi],dl
     inc edi
     mov al,[esi]
     inc esi
     call @isValidChar
     jnz @B
@R:  mov BYTE PTR [edi],0
     ret
@isValidChar:
     push esi
     movzx edx,al
     mov ecx,INTS_LEN
     mov esi,OFFSET ints
@@:  mov eax,[esi]
     inc esi
     inc esi
     cmp dl,al
     sbb dh,0
     cmp dl,ah
     adc dh,0
     loop @B
     pop esi
     retn
ints db '+','+' + 1
     db '/','9' + 1
     db '=','=' + 1
     db 'A','Z' + 1
     db 'a','z' + 1
INTS_LEN  EQU ($ - ints) / 2
_b64_trim ENDP

END