我们在执行应用程序时经常会指定命令行参数来传递程序运行所需要的数据,控制程序的执行。
高级程序设计语言会自动分析和提供命令行参数,而在汇编语言中,则要由我们DIY了。
下面是一个演示程序,我们先用Windows API函数GetCommandLine获取命令行,然后进行分析和显示。
源代码和可执行程序压缩包 CmdParam.rar(2KB) 可以到
http://purpleendurer.ys168.com/ 的 myworks / demo_only 中下载。
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ; 文件名: CmdParam.asm ; 功 能: 获取命令行,分析并显示命令行参数 ; 支持/开头的参数、半角双引号括起来的参数 ; 作 者: Purple Endurer ; 环 境: Win XP + MASM32 v7 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< .386 .model flat,stdcall Option CaseMap:none include /masm32/include/windows.inc include /masm32/include/kernel32.inc includelib /masm32/lib/kernel32.lib include /masm32/include/user32.inc includelib /masm32/lib/user32.lib GetCmdParam PROTO :LPSTR, :dword ;分析命令行参数 ;ssssssssssssssssssssss ;.const ;ssssssssssssssssssssss c_ParamNum equ 4 ;假设命令行参数个数 ;ssssssssssssssssssssss .data ;ssssssssssssssssssssss g_szCaption db "命令行参数", 0 g_dwParamArray dword c_ParamNum+1 dup(0);存放各命令行参数首地址 g_szCmdLine db 256 dup (?);存放命令行参数 ;ssssssssssssssssssssss .code ;ssssssssssssssssssssss start: invoke GetCmdParam, addr g_szCmdLine, addr g_dwParamArray mov edi, offset g_dwParamArray .while (dword ptr [edi] != 0) push edi invoke MessageBox, NULL, [edi], addr g_szCaption, MB_OK pop edi add edi, 4 .endw invoke ExitProcess, NULL ;/ ; 功能:取命令行并分析出参数 ; 输入:lpszCmdLine:存放命令行参数的内存空间首址 ; lpdwParam:存放命令行参数首地址的内存空间首址 ; 输出:无 ;/ GetCmdParam proc lpszCmdLine: LPSTR, lpdwParam: dword local dwFlag: dword local dwParamCount: dword invoke GetCommandLine ;取命令行 invoke lstrcpy, lpszCmdLine, eax mov eax, lpszCmdLine mov esi, eax mov edi, lpdwParam mov dword ptr [edi], eax ;save param 0 add edi, 4 mov dwFlag, 1 mov dwParamCount, 1 @GetCmdParamNext: inc esi movzx eax, byte ptr [esi] cmp eax, 0 je @GetCmdParamRet cmp eax, ' ' ;skip Space jne @F cmp dwFlag, 0 je @GetCmdParamNext jne @GetCmdParamEnd @@: cmp eax, 9 ;skip Tab jne @F cmp dwFlag, 0 jne @GetCmdParamEnd je @GetCmdParamNext @@: cmp eax, '/' jne @F cmp dwFlag, '"' je @GetCmdParamNext jne @GetCmdParamSave @@: cmp eax, '"' jne @F cmp dwFlag, 0 je @GetCmdParamSave inc esi mov dwFlag, 1 jmp @GetCmdParamEnd @@: cmp dwFlag, 0 jne @GetCmdParamNext @GetCmdParamSave: inc dwParamCount cmp dwParamCount, c_ParamNum jg @GetCmdParamRet mov dwFlag, eax mov dword ptr [edi], esi add edi, 4 jmp @GetCmdParamNext @GetCmdParamEnd: cmp dwFlag, '"' je @GetCmdParamNext mov dwFlag, 0 mov byte ptr [esi], 0 jmp @GetCmdParamNext @GetCmdParamRet: ret GetCmdParam endp end start