WIN32汇编语言教程:第13章 进程控制 · 13.1 环境变量和命令行参数(3)
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
;####################################################################
这两个通用子程序被存放在_CmdLine.asm文件中,读者可以在其他的程序中用include语句将它包含使用,其中函数_argc返回命令行参数的个数,当执行文件时没有附带参数的时候,函数的返回值一般是1,这时获取的命令行字符串中仅有一个组成部分——那就是可执行文件名;_argv函数则将指定编号的参数返回到一个缓冲区中,读者可以这样使用:
invoke _argv,dwArgv,lpReturn,dwSize
其中dwArgv参数指定要获取的参数编号,0表示获取字符串中的第一个组成部分(一般是文件名),1表示获取第二个组成部分,也就是在文件名后面输入的第1个参数,以此类推,函数对返回的字符串已经做了处理,丢弃了中间或者两端的所有双引号。lpReturn指向用来接收参数字符串的缓冲区,dwSize指定了缓冲区的大小。
这里有一个使用这两个函数的例子,源代码在所附光盘的Chapter13\CmdLine目录中,其中CmdLine.asm的内容如下:
.386
.model flat,stdcall
option casemap:none
;####################################################################
; Include 文件定义
;####################################################################
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;####################################################################
; 数据段
;####################################################################
.data?
szBuffer1 db 4096 dup (?)
szBuffer2 db 4096 dup (?)
szOutput db 8192 dup (?)
.const
szCaption db '命令行参数',0
szFormat1 db '可执行文件名称:',0dh,0ah,'%s',0dh,0ah,0ah
db '参数总数:%d',0dh,0ah,0
szFormat2 db '参数[%d]:%s',0dh,0ah,0
;####################################################################
; 代码段
;####################################################################
.code
include _Cmdline.asm ;包含公用的命令行参数处理函数
;####################################################################
start:
invoke GetModuleFileName,NULL,\
offset szBuffer1,sizeof szBuffer1
invoke _argc
mov ebx,eax
invoke wsprintf,addr szOutput,addr szFormat1,\
addr szBuffer1,eax
xor esi,esi
.while esi < ebx
invoke _argv,esi,addr szBuffer2,sizeof szBuffer2
invoke wsprintf,addr szBuffer1,\
addr szFormat2,esi,addr szBuffer2
invoke lstrcat,addr szOutput,addr szBuffer1
inc esi
.endw
invoke MessageBox,NULL,addr szOutput,addr szCaption,MB_OK
invoke ExitProcess,NULL
;####################################################################
end start
上页:第13章 进程控制 · 13.1 环境变量和命令行参数(2) 下页:第13章 进程控制 · 13.1 环境变量和命令行参数(4)