注册 登录
编程论坛 汇编论坛

最后一行,哪里错了

u332744 发布于 2012-08-17 17:55, 960 次点击
        .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
20 回复
#2
zklhp2012-08-17 19:00
代码也没贴全啊
#3
u3327442012-08-20 11:38
回复 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
#4
u3327442012-08-20 11:39
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 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
#5
zklhp2012-08-20 13:12
        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 编辑 ]
#6
u3327442012-08-20 17:29
我想汇编运行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总是不行,最近看到汇编可以实现控制台命令,故此做个尝试
#7
zklhp2012-08-20 17:34
如果是用作system函数 CreateProcess的用法应该是第二参数放完整命令行 你用的不对 而且你的命令行生成的也不对

这个还不如用批处理实现呢 简单方便
#8
u3327442012-08-20 17:59
invoke    CreateProcess可以调用批处理吗?帮我写下源代码好吗? 谢谢,我想知道汇编invoke    CreateProcess怎么用
#9
zklhp2012-08-20 18:07
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打开比较方便



#10
zklhp2012-08-20 18:29
以下是引用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比较好
#11
zklhp2012-08-20 18:30
如果没问题了记得结题啊 最近得分很少 都不爱给分 很受打击啊
#12
pangding2012-08-20 22:25
回复 11楼 zklhp
你都快破万了还嫌少呀。而且汇编的分几乎都是你的,没太多人跟你抢。

我现在汇编是不行了。那天哪个MM问了个 sub CF 标志的问题,我自己写程序试了试。
汇编时狂报了很多错误。很不解,后来查了半天才发现,凡是类似 mov eax ebx 的语句,两个参数之间我都没写逗号。


[ 本帖最后由 pangding 于 2012-8-20 22:43 编辑 ]
#13
zklhp2012-08-20 22:35
以下是引用pangding在2012-8-20 22:25:06的发言:

你都快破万了还嫌少呀。而且汇编的分几乎都是你的,没太多人跟你抢。

我现在汇编是不行了,那天哪个MM问了个 sub CF 标志的问题。
狂报了很多错误。后来查了半天才发现,凡是类似 mov eax ebx 的语句,我r 两个参数之间都没写逗号。

因为是MM 所以异常激动 错误率高点 很正常啊
#14
pangding2012-08-20 22:43
确实是激动,感觉连话都说不清楚了。正好你已经引用了,我把我的原文改改,能对比对比。
#15
zklhp2012-08-20 22:59
只有本站会员才能查看附件,请 登录


#16
pangding2012-08-20 23:19
回复 15楼 zklhp
用 vim 对比着是这样的,没想到 diff 这么标准的算法,两个编辑器还不一样呀。感觉 emacs 的那个更细致些。

只有本站会员才能查看附件,请 登录


[ 本帖最后由 pangding 于 2012-8-20 23:24 编辑 ]
#17
zklhp2012-08-20 23:22
我们又歪楼了。。
#18
pangding2012-08-20 23:28
的确。不过一开始我还是试图谈论和汇编有关的问题的……

另外我的 img 标签怎么用不好呀。一编辑帖子,附件就没掉了。
#19
zklhp2012-08-20 23:35
以下是引用pangding在2012-8-20 23:28:13的发言:

的确。不过一开始我还是试图谈论和汇编有关的问题的……

另外我的 img 标签怎么用不好呀。一编辑帖子,附件就没掉了。

没有啊 不过你用的linux罢 能发附件啊 什么浏览器?
#20
pangding2012-08-20 23:43
linux 下不能呀。想发附件就用 windows。我一般同时开两个电脑,一个台式、一个笔记本,哈哈。

我先发一个附件,等上传好了。编辑原帖,复制那个图片的地址。
可以等我编辑完了,一提交,原来那个附件就变成了 【attach】一串数字【/attach】的样子,然后图片也没了。
#21
zklhp2012-08-20 23:53
以下是引用pangding在2012-8-20 23:43:55的发言:

linux 下不能呀。想发附件就用 windows。我一般同时开两个电脑,一个台式、一个笔记本,哈哈。

我先发一个附件,等上传好了。编辑原帖,复制那个图片的地址。
可以等我编辑完了,一提交,原来那个附件就变成了 【attach】一串数字【/attach】的样子,然后图片也没了。

一般是不动原来的 再把图片发一遍 可能动了原始图片就可能出问题罢
1