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

Assembly 32-bit - Calling a program from another program

我目前正在学习汇编,我不是很新,但可能是 1 - 2 个月前。我正在使用 32 位程序集,NASM 将其 assemble 转换为 .o 文件,并 MinGW/gcc 将其编译为 .exe 文件。但是在 nasm 目录中键入 "nasm -f elf " 然后一直执行 "gcc -o " 需要花费很多时间。所以我想创建一个我刚开始的快速程序。以及所有被执行的。

所以我希望程序首先启动 nasm assembler。然后等到它完成(就像当你调用另一个函数时),然后,我想启动 gcc 编译器,等到它完成。我知道在批处理文件中制作很容易,但我仍然想学习如何在汇编中进行,以防有一天我需要这样做。所以问题是,我如何启动一个程序(使用 start/console 参数),然后等待它退出。

谢谢!

对于你的情况,我建议几个简单的方法:

  1. 切换到 FASM or what is the same, but with more advanced IDE: Fresh - 它们将编译并 运行 只需按下一个键(或单击鼠标)。 FASM IDE 仅适用于 Windows,Fresh IDE 将在 Linux 和 Windows 中正常工作。请注意,FASM 的语法非常接近 NASM 语法,因此您移动时不会有大问题。

  2. 对NASM使用一些IDE,这将使一切都以类似的方式进行。

  3. 制作小的 .BAT 文件,以自动方式 运行 命令。这是准确回答问题的最简单方法。

好吧,我的建议与您的问题有些不同,但是 IMO,无论您使用何种语言,使用良好的 IDE 对于高效工作都是必不可少的。

您可以使用 CreateProcessA and wait for its end with WaitForSingleObject 启动程序。 GCC 链接器 (LD) 还需要一个带有推送字节数的后缀(例如“@4”,一个双字 = 四个字节)。这是使用另一个链接器的一个原因。

这是一个使用 "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