标题:最后一行,哪里错了
只看楼主
u332744
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2010-9-11
结帖率:75%
已结贴  问题点数:20 回复次数:20 
最后一行,哪里错了
        .data?
szBuffer1    db    4096 dup (?)
szBuffer2    db    4096 dup (?)
szOutput    db    8192 dup (?)
stStartUp    STARTUPINFO        <>
stProcInfo    PROCESS_INFORMATION    <>
        .const
szCaption    db    'cmd param',0
szFormat1    db    'exe file name',0dh,0ah,'%s',0dh,0ah,0ah
        db    'param sum',0dh,0ah,0
szFormat2    db    'param',0dh,0ah,0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; &acute;ú&Acirc;&euml;&para;&Icirc;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .code
include        _Cmdline.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
        
        invoke    GetStartupInfo,addr stStartUp
        
        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    CreateProcess,addr szOutput,NULL,NULL,NULL,NULL,\
            NORMAL_PRIORITY_CLASS or CREATE_SUSPENDED,NULL,NULL,\
            offset stStartUp,offset stProcInfo
搜索更多相关主题的帖子: file 
2012-08-17 17:55
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:10 
代码也没贴全啊
2012-08-17 19:00
u332744
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2010-9-11
得分:0 
回复 2楼 zklhp
        .386
        .model flat,stdcall
        option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include &Icirc;&Auml;&frac14;&thorn;&para;¨&Ograve;&aring;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include        windows.inc
include        user32.inc
includelib    user32.lib
include        kernel32.inc
includelib    kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; &Ecirc;&yacute;&frac34;&Yacute;&para;&Icirc;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .data?
szBuffer1    db    4096 dup (?)
szBuffer2    db    4096 dup (?)
szOutput    db    8192 dup (?)
stStartUp    STARTUPINFO        <>
stProcInfo    PROCESS_INFORMATION    <>
        .const
szCaption    db    'cmd param',0
szFormat1    db    'exe file name',0dh,0ah,'%s',0dh,0ah,0ah
        db    'param sum',0dh,0ah,0
szFormat2    db    'param',0dh,0ah,0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; &acute;ú&Acirc;&euml;&para;&Icirc;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .code
include        _Cmdline.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
        
        invoke    GetStartupInfo,addr stStartUp
        
        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    CreateProcess,addr szOutput,NULL,NULL,NULL,NULL,\
            NORMAL_PRIORITY_CLASS,NULL,NULL,\
            offset stStartUp,offset stProcInfo
        ;







        invoke    ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        end    start
2012-08-20 11:38
u332744
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2010-9-11
得分:0 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming 2nd Edition>
; by 罗云彬, http://asm.
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; _CmdLine.asm
; 命令行参数分析的通用子程序
; 功能:
; _argc ---> 对命令行参数进行数量统计
; _argv ---> 取某个命令行参数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
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
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 取指定位置的命令行参数
;  argv 0 = 执行文件名
;  argv 1 = 参数1 ...
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_argv        proc    _dwArgv,_lpReturn,_dwSize
        local    @dwArgv,@dwFlag

        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
2012-08-20 11:39
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
        invoke    MessageBox,NULL,addr szOutput,addr szCaption,MB_OK
        invoke    CreateProcess,addr szOutput,NULL,NULL,NULL,NULL,\
            NORMAL_PRIORITY_CLASS,NULL,NULL,\
            offset stStartUp,offset stProcInfo

首先没明白你想干什么 其次是 这里输出的内容和新建进程一样 应该是不行的罢

而且 CreateProcess 这个API一般是用第二个参数 参数的内容就是要执行的命令行 如果用第一个 带的时候比较麻烦 win32汇编 还是属于windows编程 所以 还是要按windows的规定来

祝你早日成功


[ 本帖最后由 zklhp 于 2012-8-20 13:17 编辑 ]
2012-08-20 13:12
u332744
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2010-9-11
得分:0 
我想汇编运行mysql程序, cmdline mysql -h 112.22.12.323 -u...........................
所以加了这么一句
invoke    CreateProcess,addr szOutput,NULL,NULL,NULL,NULL,\
            NORMAL_PRIORITY_CLASS,NULL,NULL,\
            offset stStartUp,offset stProcInfo

先调试下看看cmdline mma.exe (mma.exe是一个PRINTF的程序)能不能运行,结果发现CreateProcess不成功,因为我在C++里面用SYSTEM("mysql -h 112.22.12.323 -u...........................") 是可以运行的,
可是用CreateProcess总是不行,最近看到汇编可以实现控制台命令,故此做个尝试
2012-08-20 17:29
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
如果是用作system函数 CreateProcess的用法应该是第二参数放完整命令行 你用的不对 而且你的命令行生成的也不对

这个还不如用批处理实现呢 简单方便
2012-08-20 17:34
u332744
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2010-9-11
得分:0 
invoke    CreateProcess可以调用批处理吗?帮我写下源代码好吗? 谢谢,我想知道汇编invoke    CreateProcess怎么用
2012-08-20 17:59
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
SYSTEM("mysql -h 112.22.12.323 -u...........................")

比如说就这个 最简单的实现方法

程序代码:
.386
.model flat, stdcall
option casemap :none

include windows.inc
include user32.inc
include kernel32.inc
include shell32.inc
include masm32.inc

includelib user32.lib
includelib kernel32.lib
includelib shell32.lib
includelib masm32.lib
include macro.asm

.data?
    buffer    db 100 dup(?)
   
.CODE
START:
   
    invoke ShellExecute,NULL,CTXT('open'),CTXT('a.bat'),NULL,NULL,SW_SHOWNORMAL

    invoke StdOut,CTXT('回车键退出...',0dh,0ah)
    ;暂停显示,回车键关闭
    invoke StdIn,addr buffer,sizeof buffer
    invoke ExitProcess,0
   
end START


用这个shell32.inc里面的API打开比较方便



2012-08-20 18:07
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
以下是引用zklhp在2012-8-20 18:07:05的发言:

SYSTEM("mysql -h 112.22.12.323 -u...........................")

比如说就这个 最简单的实现方法

 
.386
.model flat, stdcall
option casemap :none
 
include windows.inc
include user32.inc
include kernel32.inc
include shell32.inc
include masm32.inc
 
includelib user32.lib
includelib kernel32.lib
includelib shell32.lib
includelib masm32.lib
include macro.asm
 
.data?
    buffer    db 100 dup(?)
   
.CODE
START:
   
    invoke ShellExecute,NULL,CTXT('open'),CTXT('a.bat'),NULL,NULL,SW_SHOWNORMAL
 
    invoke StdOut,CTXT('回车键退出...',0dh,0ah)
    ;暂停显示,回车键关闭
    invoke StdIn,addr buffer,sizeof buffer
    invoke ExitProcess,0
   
end START


用这个shell32.inc里面的API打开比较方便

程序代码:
.386
.model flat, stdcall
option casemap :none

include windows.inc
include user32.inc
include kernel32.inc
include shell32.inc
include masm32.inc

includelib user32.lib
includelib kernel32.lib
includelib shell32.lib
includelib masm32.lib
include macro.asm

.data?
    buffer    db 100 dup(?)
    stSI        dd ?        ;PPROCESS_INFORMATION
    stPI        dd ?
   
.CODE
START:
   
    ;invoke ShellExecute,NULL,CTXT('open'),CTXT('a.bat'),NULL,NULL,SW_SHOWNORMAL
    invoke CreateProcess,NULL,CTXT('a.bat'),NULL,NULL,FALSE,NULL,NULL,NULL,offset stSI,offset stPI
    invoke CloseHandle,[PROCESS_INFORMATION ptr stSI].hThread
    invoke CloseHandle,[PROCESS_INFORMATION ptr stSI].hProcess

    invoke StdOut,CTXT('回车键退出...',0dh,0ah)
    ;暂停显示,回车键关闭
    invoke StdIn,addr buffer,sizeof buffer
    invoke ExitProcess,0
   
end START


有错误 琢磨了半天没搞明白 虽然能执行bat文件但因为查找路径的原因执行不了命令 基本是废品

你也看出来了 CreateProcess参数多 用法复杂 虽然功能强大可是太难用了 如果只不过是启动一个程序没有特殊要求直接用我上面贴的那个API比较好
2012-08-20 18:29



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-379684-1-1.html




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

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