www.pudn.com > asmping.zip > CmdLine.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; Programmed by 罗云彬, bigluo@telekbird.com.cn ; Website: http://asm.yeah.net ; LuoYunBin's Win32 ASM page (罗云彬的编程乐园) ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 公用子程序:命令行参数处理 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; ; ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 取命令行参数个数 (arg count) ; 参数个数必定大于等于 1, 参数 1 为当前执行文件名 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> CHAR_BLANK equ 20h CHAR_DELI equ '"' _argc proc local @dwArgc pushad mov @dwArgc,0 invoke GetCommandLine mov esi,eax cld _argc_loop: ;******************************************************************** ; 忽略参数之间的空格 ;******************************************************************** lodsb or al,al jz _argc_end cmp al,CHAR_BLANK jz _argc_loop ;******************************************************************** ; 一个参数开始 ;******************************************************************** dec esi inc @dwArgc _argc_loop1: lodsb or al,al jz _argc_end cmp al,CHAR_BLANK jz _argc_loop ;参数结束 cmp al,CHAR_DELI jnz _argc_loop1 ;继续处理参数内容 ;******************************************************************** ; 如果一个参数中的一部分有空格,则用 " " 包括 ;******************************************************************** @@: lodsb or al,al jz _argc_end cmp al,CHAR_DELI jnz @B jmp _argc_loop1 _argc_end: popad mov eax,@dwArgc ret _argc endp ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 取指定位置的命令行参数 ; argv 0 = 执行文件名 ; argv 1 = 参数1 ... ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> _argv proc _dwArgv,_lpReturn,_dwSize local @dwArgv,@dwFlag pushad inc _dwArgv mov @dwArgv,0 mov edi,_lpReturn invoke GetCommandLine mov esi,eax cld _argv_loop: ;******************************************************************** ; 忽略参数之间的空格 ;******************************************************************** lodsb or al,al jz _argv_end cmp al,CHAR_BLANK jz _argv_loop ;******************************************************************** ; 一个参数开始 ; 如果和要求的参数符合,则开始复制到返回缓冲区 ;******************************************************************** dec esi inc @dwArgv mov @dwFlag,FALSE mov eax,_dwArgv cmp eax,@dwArgv jnz @F mov @dwFlag,TRUE @@: _argv_loop1: lodsb or al,al jz _argv_end cmp al,CHAR_BLANK jz _argv_loop ;参数结束 cmp al,CHAR_DELI jz _argv_loop2 cmp _dwSize,1 jle @F cmp @dwFlag,TRUE jne @F stosb dec _dwSize @@: jmp _argv_loop1 ;继续处理参数内容 _argv_loop2: lodsb or al,al jz _argv_end cmp al,CHAR_DELI jz _argv_loop1 cmp _dwSize,1 jle @F cmp @dwFlag,TRUE jne @F stosb dec _dwSize @@: jmp _argv_loop2 _argv_end: xor al,al stosb popad ret _argv endp ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 转换字符串的值 ; 参数:字符串地址,进制(缺省为10进制) ; 返回:数值 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> _GetStringValue proc _lpString,_dwBase local @dwValue pushad mov ebx,_dwBase .if ebx == 0 mov ebx,10 .endif xor eax,eax mov esi,_lpString _GSV_Loop: mov cl,[esi] inc esi or cl,cl jz _GSV_LoopEnd ; cmp cl,20h ; jz _GSV_Loop cmp cl,'0' jb _GSV_LoopEnd cmp cl,'9' ja _GSV_Check1 sub cl,'0' jmp _GSV_CheckOK _GSV_Check1: or cl,20h cmp cl,'a' jb _GSV_LoopEnd cmp cl,'f' ja _GSV_LoopEnd sub cl,'a'-10 _GSV_CheckOK: movzx ecx,cl cmp ecx,ebx jae _GSV_LoopEnd mul ebx add eax,ecx jmp short _GSV_Loop _GSV_LoopEnd: mov @dwValue,eax popad mov eax,@dwValue ret _GetStringValue endp ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>