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 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>