MASM32编程分析、获取命令行参数

本文介绍了一个使用MASM32在Windows环境下编写的小型汇编程序,该程序能够获取并解析命令行参数,包括支持以/开头的选项及用双引号括起的参数。

我们在执行应用程序时经常会指定命令行参数来传递程序运行所需要的数据,控制程序的执行。

高级程序设计语言会自动分析和提供命令行参数,而在汇编语言中,则要由我们DIY了。

下面是一个演示程序,我们先用Windows API函数GetCommandLine获取命令行,然后进行分析和显示。

源代码和可执行程序压缩包 CmdParam.rar(2KB) 可以到

http://download.youkuaiyun.com/source/1214888

http://purpleendurer.ys168.com/的 myworks / demo_only 中下载。


;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;文件名:CmdParam.asm
;功 能:获取命令行,分析并显示命令行参数
;支持/开头的参数、半角双引号括起来的参数
;作 者:PurpleEndurer
;环 境:WinXP+MASM32v7
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

.386
.modelflat,stdcall
OptionCaseMap: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_ParamNumequ4;假设命令行参数个数


;ssssssssssssssssssssss
.data
;ssssssssssssssssssssss
g_szCaptiondb"命令行参数",0
g_dwParamArray
dwordc_ParamNum+1dup(0);存放各命令行参数首地址
g_szCmdLinedb256dup(?);存放命令行参数


;ssssssssssssssssssssss
.code
;ssssssssssssssssssssss
start:
invokeGetCmdParam,addrg_szCmdLine,addrg_dwParamArray
movedi,offsetg_dwParamArray
.while(dwordptr[edi]!=0)
pushedi
invokeMessageBox,NULL,[edi],addrg_szCaption,MB_OK
popedi
addedi,4
.endw
invokeExitProcess,NULL


;/////////////////////////////////////////////////////////////
;功能:取命令行并分析出参数
;输入:lpszCmdLine:存放命令行参数的内存空间首址
;lpdwParam:存放命令行参数首地址的内存空间首址
;输出:无
;/////////////////////////////////////////////////////////////
GetCmdParamproclpszCmdLine:LPSTR,lpdwParam:dword
localdwFlag:dword
localdwParamCount:dword
invokeGetCommandLine;取命令行
invokelstrcpy,lpszCmdLine,eax
moveax,lpszCmdLine
movesi,eax
movedi,lpdwParam
movdwordptr[edi],eax;saveparam0
addedi,4
movdwFlag,1
movdwParamCount,1
@GetCmdParamNext:
incesi
movzxeax,byteptr[esi]
cmpeax,0
je@GetCmdParamRet
cmpeax,'';skipSpace
jne@F
cmpdwFlag,0
je@GetCmdParamNext
jne@GetCmdParamEnd
@@:
cmpeax,9;skipTab
jne@F
cmpdwFlag,0
jne@GetCmdParamEnd
je@GetCmdParamNext
@@:
cmpeax,'/'
jne@F
cmpdwFlag,'"'
je@GetCmdParamNext
jne@GetCmdParamSave
@@:
cmpeax,'"'
jne@F
cmpdwFlag,0
je@GetCmdParamSave
incesi
movdwFlag,1
jmp@GetCmdParamEnd
@@:
cmpdwFlag,0
jne@GetCmdParamNext

@GetCmdParamSave:
incdwParamCount
cmpdwParamCount,c_ParamNum
jg@GetCmdParamRet
movdwFlag,eax
movdwordptr[edi],esi
addedi,4
jmp@GetCmdParamNext

@GetCmdParamEnd:
cmpdwFlag,'"'
je@GetCmdParamNext
movdwFlag,0
movbyteptr[esi],0
jmp@GetCmdParamNext
@GetCmdParamRet:
ret
GetCmdParamendp

endstart

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值