|  
 原帖及讨论:http://bbs.bccn.net/thread-227571-1-1.html 偶要写个发电子邮件的程序 用到了base64算法 就用汇编实现了一下 还望各位高手指点下 
 贴下源码吧
 
 ;*****************************************************************************************************************
 ;函数功能:实现 base64 算法
 ;参数:_lpszInput 指向输入的缓冲区  _dwInputLen 给出长度  _lpszOutput 指向输入的缓冲区
 ;返回值:成功返回0  不成功返回 -1
 ;作者:zklhp  Email:zklhp@sina.com
 ;时间:2008.8.8
 ;版权所有    转载请保持完整
 ;*****************************************************************************************************************
 
 .DATA
 base64_alphabet db "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",0
 
 .CODE
 _base64 proc uses ebx esi edi _lpszInput:DWORD,_dwInputLen:DWORD,_lpszOutput:DWORD
 .if (_lpszInput==NULL)||(_lpszOutput==NULL)||(_dwInputLen==0)
 xor eax,eax
 dec eax
 ret
 .endif
 
 mov eax,_dwInputLen
 xor edx,edx
 mov ecx,3
 div ecx
 push eax
 
 .if eax > 0
 dec eax
 .if eax > 0
 push eax
 
 push ebp
 mov esi,_lpszInput
 mov edi,_lpszOutput
 mov ebp,eax
 lea edi,[edi+ebp*4]
 neg ebp
 
 align 4
 @@:
 
 mov ebx,DWORD ptr [esi]
 bswap ebx
 mov ecx,ebx
 mov edx,ebx
 mov eax,ebx
 shr ecx,14
 shr edx,8
 shr eax,26
 and ecx,3Fh
 shr ebx,20
 and edx,3Fh
 and eax,3Fh
 movzx ecx, BYTE PTR [base64_alphabet+ecx]
 and ebx,3Fh
 mov ch , BYTE PTR [base64_alphabet+edx]
 movzx eax, BYTE PTR [base64_alphabet+eax]
 shl ecx,16
 mov ah,BYTE PTR [base64_alphabet+ebx]
 
 add esi,3
 or ecx,eax
 mov [edi+ebp*4],ecx
 
 add ebp,1
 jnz @B
 pop ebp
 
 pop eax
 mov ecx,eax
 mov ebx,3
 mul ebx
 add _lpszInput,eax
 shl ecx,2
 add _lpszOutput,ecx
 .endif
 
 mov esi,_lpszInput
 mov edi,_lpszOutput
 mov ebx,DWORD ptr [esi]
 bswap ebx
 mov ecx,ebx
 mov edx,ebx
 mov eax,ebx
 shr ecx,14
 shr edx,8
 shr eax,26
 and ecx,3Fh
 shr ebx,20
 and edx,3Fh
 and eax,3Fh
 movzx ecx, BYTE PTR [base64_alphabet+ecx]
 and ebx,3Fh
 mov ch , BYTE PTR [base64_alphabet+edx]
 movzx eax, BYTE PTR [base64_alphabet+eax]
 shl ecx,16
 mov ah,BYTE PTR [base64_alphabet+ebx]
 or ecx,eax
 mov [edi],ecx
 add _lpszInput,3
 add _lpszOutput,4
 .endif
 pop eax
 mov ecx,3
 mul ecx
 neg eax
 add eax,_dwInputLen
 ;int 3h
 .if eax == 1
 mov esi,_lpszInput
 mov edi,_lpszOutput
 movzx ecx,BYTE ptr [esi]
 mov ebx,ecx
 shr ecx,2
 movzx ecx,BYTE ptr [base64_alphabet+ecx]
 shl ebx,4
 and ebx,03fh
 movzx ebx,BYTE ptr [base64_alphabet+ebx]
 shl ebx,8
 or ecx,ebx
 xor edx,edx
 mov dl,'='
 mov dh,'='
 shl edx,16
 or ecx,edx
 mov [edi],ecx
 .elseif eax == 2
 mov esi,_lpszInput
 mov edi,_lpszOutput
 movzx ecx,BYTE ptr [esi]
 mov ebx,ecx
 shr ecx,2
 movzx ecx,BYTE ptr [base64_alphabet+ecx]
 movzx eax,BYTE ptr [esi+1]
 mov edx,eax
 shr eax,4
 shl ebx,4
 or ebx,eax
 and ebx,03fh
 movzx ebx,BYTE ptr [base64_alphabet+ebx]
 shl edx,2
 and edx,03fh
 movzx edx,BYTE ptr [base64_alphabet+edx]
 xor eax,eax
 mov ah,'='
 shl eax,16
 or ecx,eax
 shl ebx,8
 or ecx,ebx
 shl edx,16
 or ecx,edx
 mov [edi],ecx
 .endif
 
 xor eax,eax
 ret
 _base64 endp
 
 参考了网上的一篇base64优化的文章 向高手的无私奉献精神表示感谢
 
 程序+源码+参考资料已打包
 base64encoder.rar     
 |