[英]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 编译器,然后等到它完成。 我知道在批处理文件中制作很容易,但我仍然想学习如何在汇编中完成它,以防有一天我需要这样做。 所以问题是,我如何启动一个程序(使用启动/控制台参数),然后也等待它退出。
谢谢!
您可以使用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.