2015-03-25 48 views
0

我目前正在學習大會,我不是很新,但可能在1 - 2個月後。我正在使用32位程序集NASM將它彙編成一個.o文件,並使用MinGW/gcc編譯爲一個.exe文件。但需要很長時間才能在nasm目錄中鍵入「nasm -f elf」,然後始終執行「gcc -o」。所以我想創建一個快速程序,我只是開始它。和所有得到執行。大會32位 - 從另一個程序調用程序

所以我想讓程序首先啓動nasm彙編程序。然後等待完成(就像調用另一個函數時一樣),然後,我想啓動gcc編譯器,然後等待完成。我知道在批處理文件中製作很容易,但我仍然想要學會如何在裝配中完成它,因爲我有一天需要這樣做。所以問題是,我該如何啓動一個程序(使用啓動/控制檯參數),然後等待它退出。

謝謝!

+0

如果你使用Win32 API,開始與['ShellExecuteEx']可執行文件(https://msdn.microsoft.com/en-us/library/windows/desktop/bb762154(v = VS .85).aspx)並等待它以完成['MsgWaitForMultipleObjects'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms684242%28v=vs.85%29.aspx)。或者,如果你正在鏈接'libc' /'msvcrt',你可以使用'system()'函數。 – Michael 2015-03-25 08:24:45

回答

0

在你的情況,我會建議幾種簡單的方法:

  1. 切換到FASM或什麼是相同的,但更先進的IDE:Fresh - 他們將編譯並在一個按鍵上運行(或鼠標點擊)。 FASM IDE僅適用於Windows,Fresh IDE在Linux和Windows中可以正常工作。請注意,FASM的語法非常接近NASM語法,因此您不會遇到大問題。

  2. 使用一些用於NASM的IDE,它將以類似的方式創建所有內容。

  3. 製作一個小的.BAT文件,以自動方式運行命令。這是在你的問題中完成你所要求的最簡單的方法。

嗯,我的建議是從你的問題有些不同,但IMO,用良好的IDE是富有成效的工作至關重要,無論你使用的語言。

0

您可以用CreateProcessA啓動程序並等待WaitForSingleObject結束。 GCC連接器(LD)還需要一個帶有被推入的字節數的後綴(例如「@ 4」,一個dword =四個字節)。這是使用另一個鏈接器的原因之一。

這裏有一個簡單的例子,以一個 「目錄」 啓動一個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 [email protected], [email protected],[email protected] 
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 [email protected]   ; https://msdn.microsoft.com/library/windows/desktop/ms682425.aspx 

    ; WaitForSingleObject(procinfo.hProcess, INFINITE); 
    push -1   ; INFINITE 
    push dword [procinfo + _PROCESS_INFORMATION.hProcess] 
    call [email protected] 

    ; 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 [email protected] 

在(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 
相關問題