| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 963 人关注过本帖
标题:字符串操作~高手进!
只看楼主 加入收藏
honker
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2008-6-30
收藏
 问题点数:0 回复次数:4 
字符串操作~高手进!
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
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
搜索更多相关主题的帖子: 字符 
2008-08-21 17:27
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
俺也是刚接触的,试试看吧~~
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
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起的作用.

呵呵~~我这菜鸟的水平也只能这么注释了~~
2008-08-21 19:03
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
建议楼主,最简单的方法是:把一个命令行,逐个字母地放到程序里面,一个一个地去判断,即,等于单步跟踪,或单步中断了~~~
2008-08-21 19:08
honker
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2008-6-30
收藏
得分:0 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
CHAR_BLANK    equ    20h    ;定义空格
CHAR_DELI    equ    '"'    ;定义分隔符

_argc        proc
        local    @dwArgc 返回的参数个数局部变量

        pushad   保存全部寄存器
        mov    @dwArgc,0  把返回的参数个数局部变量填0
        invoke    GetCommandLine 获取命令行参数
        mov    esi,eax 把返回的参数存储单元的偏移地址送ESI
        cld  把DF标志位填0
_argc_loop:
;********************************************************************
; 忽略参数之间的空格
;********************************************************************
        lodsb        取ESI地址里第1个字节
        or    al,al   如果是0则程序结束
        jz    _argc_end
        cmp    al,CHAR_BLANK 取ESI地址里第1个字节是否空格
        jz    _argc_loop  是则循环取第1个字节 不是则把ESI地址

减0然后@dwArgc+上1
;********************************************************************
; 一个参数开始
;********************************************************************
        dec    esi
        inc    @dwArgc
_argc_loop1:
        lodsb 从新取第1个字节
        or    al,al 判断是否0 含义同上
        jz    _argc_end
        cmp    al,CHAR_BLANK  是否空格
        jz    _argc_loop(这里不懂 是空格跳到_argc_loop怎么是

参数结束?)        ;参数结束
        cmp    al,CHAR_DELI 判断是否"号
        jnz    _argc_loop1    不是则跳到_argc_loop1    ;继续处

理参数内容
;********************************************************************
; 如果一个参数中的一部分有空格,则用 " " 包括
;********************************************************************
        @@:
        lodsb 是则取第2个字节
        or    al,al 判断是否0是则结束
        jz    _argc_end
        cmp    al,CHAR_DELI 不是则判断是不是"号
        jnz    @B 不是则跳回@@:标号处执行
        jmp    _argc_loop1 是则跳到_argc_loop1处
_argc_end:
        popad  把先保存的寄存器恢复
        mov    eax,@dwArgc 返回参数个数到EAX里
        ret

_argc        endp
--------------------------------------------------------------------
这些我差不多都懂 就不知道含义 请上面那位前辈重点一点一点分析下思路可以吗?
2008-08-21 19:41
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
jz    _argc_loop(这里不懂 是空格跳到_argc_loop怎么是

参数结束?)        ;参数结束
========================================================
因为空格是参数的分隔符啊~~

思路???
我觉得最好的方法就是一个一个字母地套下去了~~
如,你用 abc def "ghi jkl" omn 这4个参数去试试?
2008-08-21 22:07
快速回复:字符串操作~高手进!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019034 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved