![]() |
#2
ONEPROBLEM2008-08-21 19:03
俺也是刚接触的,试试看吧~~
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> CHAR_BLANK equ 20h ;定义空格 CHAR_DELI equ '"' ;定义分隔符 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 取命令行参数个数 (arg count) ; 参数个数必定大于等于 1, 参数 1 为当前执行文件名 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> _argc proc local @dwArgc ;局部变量,返回参数个数 pushad ;寄存器入栈 mov @dwArgc,0 ;初始化为0 invoke GetCommandLine mov esi,eax ;esi指向参数字符串首地址了 cld ;置DF=0,每次操作后,esi自增1 _argc_loop: ;******************************************************************** ; 忽略参数之间的空格 ;******************************************************************** lodsb ;把第一个字母放入al or al,al ;如果ZF=1,即al为0,则跳_argc_end jz _argc_end cmp al,CHAR_BLANK ;判断al是不是空格 jz _argc_loop ;是则回去重新装下一字母 ;******************************************************************** ; 一个参数开始 ;******************************************************************** dec esi ;esi减1,回到上一位,即刚判断完的 inc @dwArgc ;第一个字母不是0也不是空格,则是参数了 _argc_loop1: lodsb ;重新装第一个字母到al or al,al jz _argc_end cmp al,CHAR_BLANK jz _argc_loop ;参数结束 cmp al,CHAR_DELI jnz _argc_loop1 ;继续处理参数内容 ;******************************************************************** ; 如果一个参数中的一部分有空格,则用 " " 包括 ;******************************************************************** @@: lodsb ;装第二个字母到al中 or al,al jz _argc_end cmp al,CHAR_DELI ;不是双引号,再往下装 jnz @B jmp _argc_loop1 _argc_end: popad mov eax,@dwArgc ret _argc endp -------------------------------------------------------------------------------------------------------- 注:每个参数的第一个字母总会被判断两次.这就是dec esi起的作用. 呵呵~~我这菜鸟的水平也只能这么注释了~~ ![]() |
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
CHAR_BLANK equ 20h ;定义空格
CHAR_DELI equ '"' ;定义分隔符
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 取命令行参数个数 (arg count)
; 参数个数必定大于等于 1, 参数 1 为当前执行文件名
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_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
----------------------------------------------------------------------------------------------------------
这个是个取命令行参数然后计算参数个数的代码~
小弟思维不是很灵敏`那位前辈详细指点下每一句代码的含义! very thank your