[转载]Http/ftp 文件下载器
文章作者:罗云彬<BR><BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; Programmed by 罗云彬, [email]bigluo@telekbird.com.cn[/email]<BR>; Website: [url]http://asm.yeah.net[/url]<BR>; LuoYunBin's Win32 ASM page (罗云彬的编程乐园)<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; 公用子程序部分:通用部分<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>_FillMemory proto :DWORD,:DWORD,:DWORD ;填充内存<BR>_CopyMemory proto :DWORD,:DWORD,:DWORD ;拷贝内存<BR>_GetStringValue proto :DWORD,:DWORD ;转换字符串的值<BR>_GetStringPoint proto :DWORD,:DWORD,:DWORD ;取字符串第N个参数开始指针<BR>;********************************************************************<BR>; 填充内存<BR>; 参数:填充的地址,长度,填充的值<BR>; 相同于:RtlFillMemory<BR>;********************************************************************<BR>_FillMemory proc _lpDest,_dwCount,_dwChar<BR><BR> pushad<BR> mov edi,_lpDest<BR> mov eax,_dwChar<BR> mov ecx,_dwCount<BR> cld<BR> rep stosb<BR> popad<BR> ret<BR><BR>_FillMemory endp<BR>;********************************************************************<BR>; 拷贝内存<BR>; 参数:目标地址,源地址,长度<BR>; 相同于:RtlCopyMemory<BR>;********************************************************************<BR>_CopyMemory proc _lpDest,_lpSource,_dwCount<BR><BR> pushad<BR> mov esi,_lpSource<BR> mov edi,_lpDest<BR> mov ecx,_dwCount<BR> cld<BR> rep movsb<BR> popad<BR> ret<BR><BR>_CopyMemory endp<BR>;********************************************************************<BR>; 转换字符串的值<BR>; 参数:字符串地址,进制(缺省为10进制)<BR>; 返回:数值<BR>;********************************************************************<BR>_GetStringValue proc _lpString,_dwBase<BR> local @dwValue<BR><BR> pushad<BR> mov ebx,_dwBase<BR> .if ebx == 0<BR> mov ebx,10<BR> .endif<BR><BR> xor eax,eax<BR> mov esi,_lpString<BR>_GSV_Loop:<BR> mov cl,[esi]<BR> inc esi<BR> or cl,cl<BR> jz _GSV_LoopEnd<BR> cmp cl,20h<BR> jz _GSV_Loop<BR> cmp cl,'0'<BR> jb _GSV_LoopEnd<BR> cmp cl,'9'<BR> ja _GSV_Check1<BR> sub cl,'0'<BR> jmp _GSV_CheckOK<BR>_GSV_Check1:<BR> or cl,20h<BR> cmp cl,'a'<BR> jb _GSV_LoopEnd<BR> cmp cl,'f'<BR> ja _GSV_LoopEnd<BR> sub cl,'a'-10<BR>_GSV_CheckOK:<BR> movzx ecx,cl<BR> cmp ecx,ebx<BR> jae _GSV_LoopEnd<BR><BR> mul ebx<BR> add eax,ecx<BR> jmp short _GSV_Loop<BR>_GSV_LoopEnd:<BR> mov @dwValue,eax<BR> popad<BR> mov eax,@dwValue<BR> ret<BR><BR>_GetStringValue endp<BR>;********************************************************************<BR>; 取字符串第N个参数开始指针<BR>; 参数:字符串地址,第几个参数,分隔符<BR>; 返回:第N个参数指针<BR>;********************************************************************<BR>_GetStringPoint proc _lpString,_dwNumber,_dwChar<BR> local @dwPoint<BR><BR> pushad<BR> <BR> mov esi,_lpString<BR> cld<BR><BR> mov ebx,_dwChar<BR> xor ecx,ecx<BR> inc ecx<BR> cmp ecx,_dwNumber<BR> jz _GSP_OK ;如果取第一个参数直接返回<BR>_GSP_Loop:<BR> lodsb<BR> or al,al<BR> jz _GSP_Error ;如果到字符串尾还没有找到,出错<BR> cmp al,bl<BR> jnz _GSP_Loop<BR> inc ecx ;如果找到分隔符,记数加1<BR> cmp ecx,_dwNumber<BR> jnz _GSP_Loop<BR>_GSP_OK:<BR> lodsb<BR> cmp al,20h ;去掉参数前的空格<BR> jz _GSP_OK<BR> dec esi<BR> clc<BR> jmp _GSP_Return<BR>_GSP_Error:<BR> stc<BR>_GSP_Return:<BR> mov @dwPoint,esi<BR> popad<BR> mov eax,@dwPoint<BR> ret<BR><BR>_GetStringPoint endp<BR>;********************************************************************页:
[1]