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)

第13章 进程控制

版权所有 © 云南伯恩科技 证书:粤ICP备09170368号