繁体   English   中英

汇编 32 位 - 从另一个程序调用一个程序

[英]Assembly 32-bit - Calling a program from another program

我目前正在学习组装,我不是很新,但可能从 1-2 个月前开始。 我正在使用 32 位汇编,NASM 将其组装成 ao 文件和 MinGW/gcc 编译成 a.exe 文件。 但是在 nasm 目录中键入“nasm -f elf”然后一直执行“gcc -o”需要花费很多时间。 所以我想创建一个快速程序,我刚开始它。 所有这些都被执行。

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

谢谢!

对于您的情况,我建议几种简单的方法:

  1. 切换到FASM或功能相同,但具有更高级的IDE: Fresh-它们将在单个按键(或单击鼠标)的情况下进行编译和运行。 FASM IDE仅适用于Windows,Fresh IDE将在Linux和Windows中正常工作。 请注意,FASM的语法非常类似于NASM语法,因此您在移动方面不会有大问题。

  2. 为NASM使用一些IDE,这将以相似的方式进行所有操作。

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

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

您可以使用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

如果您使用 windows,您可以使用 bat 命令来执行此操作,例如: nasm BOOTLOADER.asm -f bin -o BOOTLOADER.bin pause 但这就是将名为 BOOTLOADER.asm 的文件转换为二进制文件,它的与 nasm 手册中的语法相同,因为 bat 命令发送到 comd,并且 cmd 使用环境变量,所以当您安装 nasm 时,您安装它,因此只需单击运行此 bat 文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM