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

h6my8fg2  于 2022-11-13  发布在  其他
关注(0)|答案(3)|浏览(167)

我目前正在学习汇编,我不是很新,但可能1 - 2个月前。我正在使用32位汇编,NASM将其汇编成.o文件,MinGW/gcc将其编译成.exe文件。但是在nasm目录中键入“nasm -f elf“,然后一直执行“gcc -o“,需要花费大量时间。因此,我想创建一个快速程序,在那里我只需启动它。然后执行所有操作。
所以我想让程序首先启动nasm汇编程序。然后等待它完成(就像你调用另一个函数一样),然后,我想启动gcc编译器,并等待它完成。我知道在批处理文件中做它很容易,但我仍然想学习如何在汇编中做它,以防有一天我需要这样做。所以问题是,如何启动程序(使用start/console参数),然后等待它退出。
谢谢你!

zf9nrax1

zf9nrax11#

你可以用CreateProcessA开始一个程序,然后用WaitForSingleObject等待它的结束。GCC链接器(LD)还需要一个后缀,后缀中包含推入的字节数(例如“@4”,一个双字=四个字节)。这是使用另一个链接器的一个原因。
下面是一个使用“dir”命令启动shell(cmd.exe)的简单示例:

执行目录.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
um6iljoc

um6iljoc2#

对于您的情况,我建议几种简单的方法:
1.切换到FASM或其他相同的版本,但具有更高级的IDE:Fresh-只需按下一个键(或单击鼠标)即可编译和运行。FASM IDE仅适用于Windows,Fresh IDE在Linux和Windows中都能正常工作。注意,FASM的语法非常接近NASM语法,因此您不会遇到大问题。
1.使用一些集成开发环境的NASM,将使一切以类似的方式。
1.制作一个小的.BAT文件,自动运行命令。这是最简单的方法,使你在你的问题。
好吧,我的建议与你的问题有些不同,但是我认为,使用好的IDE对于高效工作是必不可少的,不管你使用什么语言。

mzsu5hc0

mzsu5hc03#

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

相关问题