程序集 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 参数),然后等待它退出。
谢谢!
对于你的情况,我建议几个简单的方法:
切换到 FASM or what is the same, but with more advanced IDE: Fresh - 它们将编译并 运行 只需按下一个键(或单击鼠标)。 FASM IDE 仅适用于 Windows,Fresh IDE 将在 Linux 和 Windows 中正常工作。请注意,FASM 的语法非常接近 NASM 语法,因此您移动时不会有大问题。
对NASM使用一些IDE,这将使一切都以类似的方式进行。
制作小的 .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
我目前正在学习汇编,我不是很新,但可能是 1 - 2 个月前。我正在使用 32 位程序集,NASM 将其 assemble 转换为 .o 文件,并 MinGW/gcc 将其编译为 .exe 文件。但是在 nasm 目录中键入 "nasm -f elf " 然后一直执行 "gcc -o " 需要花费很多时间。所以我想创建一个我刚开始的快速程序。以及所有被执行的。
所以我希望程序首先启动 nasm assembler。然后等到它完成(就像当你调用另一个函数时),然后,我想启动 gcc 编译器,等到它完成。我知道在批处理文件中制作很容易,但我仍然想学习如何在汇编中进行,以防有一天我需要这样做。所以问题是,我如何启动一个程序(使用 start/console 参数),然后等待它退出。
谢谢!
对于你的情况,我建议几个简单的方法:
切换到 FASM or what is the same, but with more advanced IDE: Fresh - 它们将编译并 运行 只需按下一个键(或单击鼠标)。 FASM IDE 仅适用于 Windows,Fresh IDE 将在 Linux 和 Windows 中正常工作。请注意,FASM 的语法非常接近 NASM 语法,因此您移动时不会有大问题。
对NASM使用一些IDE,这将使一切都以类似的方式进行。
制作小的 .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