程序集32位 - 从另一个程序调用程序

时间:2015-03-25 08:17:14

标签: windows gcc assembly x86 nasm

我目前正在学习大会,我不是很新,但可能会在1 - 2个月之后。我正在使用32位汇编,NASM将其组装成.o文件和MinGW / gcc以编译为.exe文件。但是输入" nasm -f elf"需要花费很多时间。在nasm目录中然后执行" gcc -o"每时每刻。所以我想创建一个快速程序,我只是启动它。以及所有被执行的事情。

所以我希望程序能够首先启动nasm汇编程序。然后等到它完成(比如当你调用另一个函数时),之后,我想启动gcc编译器,并等到完成。我知道它在批处理文件中很容易制作,但我仍然想学习如何在汇编中完成它,因为有一天我需要这样做。所以问题是,如何启动一个程序(带有启动/控制台参数),然后等待它退出。

谢谢!

2 个答案:

答案 0 :(得分:0)

在你的情况下,我会提出几种简单的方法:

  1. 切换到FASM或相同的内容,但使用更高级的IDE:Fresh - 他们将在单键按下(或鼠标单击)编译并运行。 FASM IDE仅适用于Windows,Fresh IDE可在Linux和Windows中正常运行。请注意,FASM的语法非常接近NASM语法,因此移动时不会有大问题。

  2. 使用一些用于NASM的IDE,它将以类似的方式制作所有内容。

  3. 创建小的.BAT文件,以自动方式运行命令。这是在问题中准确提出要求的最简单方法。

  4. 好吧,我的建议与你的问题有些不同,但IMO使用优秀的IDE对于高效工作至关重要,无论你使用哪种语言。

答案 1 :(得分:0)

您可以使用CreateProcessA启动一个程序,并等待WaitForSingleObject结束。 GCC链接器(LD)还需要具有推送字节数的后缀(例如“@ 4”,一个dword =四个字节)。这是使用另一个链接器的一个原因。

这是一个使用“dir”命令启动shell(cmd.exe)的简单示例:

<强> exec_dir.asm:

STRUC _STARTUPINFO                      ; https://msdn.microsoft.com/library/windows/desktop/ms686331.aspx
    .cb:                resd 1
    .lpReserved:        resd 1
    .lpDesktop:         resd 1
    .lpTitle:           resd 1
    .dwX:               resd 1
    .dwY:               resd 1
    .dwXSize:           resd 1
    .dwYSize:           resd 1
    .dwXCountChars:     resd 1
    .dwYCountChars:     resd 1
    .dwFillAttribute:   resd 1
    .dwFlags:           resd 1
    .wShowWindow:       resw 1
    .cbReserved2:       resw 1
    .lpReserved2:       resd 1
    .hStdInput:         resd 1
    .hStdOutput:        resd 1
    .hStdError:         resd 1
ENDSTRUC

STRUC _PROCESS_INFORMATION              ; https://msdn.microsoft.com/library/windows/desktop/ms684873.aspx
    .hProcess:      resd 1
    .hThread:       resd 1
    .dwProcessId:   resd 1
    .dwThreadId:    resd 1
ENDSTRUC

section .data
    startupinfo:
        istruc _STARTUPINFO
        iend
    procinfo:
        istruc _PROCESS_INFORMATION
        iend
    app_fullpath: db "C:\Windows\System32\cmd.exe",0
    params: db "/c dir", 0
    msg: db `\n\nok.\n`,0

global _main
EXTERN _ExitProcess@4, _CreateProcessA@40,_WaitForSingleObject@8
EXTERN _puts, _fflush

section .text
_main:

    ; CreateProcess(app_fullpath,params,0,0,false,0,0,0,&startupinfo,&procinfo)
    push procinfo
    push startupinfo
    push 0
    push 0
    push 0
    push 0
    push 0
    push 0
    push params
    push app_fullpath
    call _CreateProcessA@40         ; https://msdn.microsoft.com/library/windows/desktop/ms682425.aspx

    ; WaitForSingleObject( procinfo.hProcess, INFINITE );
    push -1         ; INFINITE
    push dword [procinfo + _PROCESS_INFORMATION.hProcess]
    call _WaitForSingleObject@8

    ; puts ("ok."), fflush to flush the stdout-buffer
    push msg
    call _puts
    mov dword [esp], 0
    call _fflush
    add esp, 4

    ; return 0
    push 0
    call _ExitProcess@4

在(Windows)命令提示符中:

PATH C:\MinGW\bin;<Path\to\nasm.exe>
nasm.exe -fwin32 exec_dir.asm
gcc.exe -m32 -o exec_dir.exe exec_dir.obj
exec_dir.exe