2013-06-26 3 views
0

Если я создал программу на ассемблере, как заставить ее работать в фоновом режиме (без какой-либо консоли)? Программа бесконечна, поэтому консоль появляется постоянно.Запуск программы в фоновом режиме - Язык ассемблера

Есть ли решение для этого или какое-то прерывание, которое позволяет мне это делать?
Спасибо всем.

EDIT: Я использую TASM компилятор, & моя операционная система Windows 7 (32bit)

+3

Как вы это сделаете для программы, которую вы написали на другом языке? Этот вопрос касается не только языка ассемблера, но и того, как заставить вашу систему вести себя по-разному. –

+2

Поиск «прекратить и остаться резидентом», если вы программируете для DOS. – Michael

+0

Не могли бы вы назвать основную функцию 'WinMain' или' wWinMain'? – Aaron

ответ

1

Используйте daemonize, если вы на Linux/Unix.

+0

Примечание: кроме «без какой-либо консоли» вы имели в виду «встроить». –

+0

Спасибо, но я на windows :) – Aviv

3

Если вы не хотите иметь консольное окно, вы должны связать свою программу с помощью /SUBSYSTEM:WINDOWS Вы можете обратиться к MSDN за различные варианты.

Но это не вопрос, связанный с сборкой, потому что то же самое относится к любому другому исполняемому файлу, который вы создаете.

2

Трюк заключается в том, что вам необходимо создать приложение Windows, а не консольное приложение. Как это сделать лучше всего демонстрировать с помощью приложения с минимальным примером.

Начнем с установки модели памяти.

.386 
.model flat 

Затем мы включаем windows.inc, который дает нам доступ к различным константам, что мы, возможно, потребуется в вызовах API. Вам probaby не понадобится, если вы не очень много работаете с Windows API.

include windows.inc 

Далее мы добавляем внешние функции для функций, которые мы хотим назвать. По крайней мере, вам нужно позвонить ExitProcess. В этом примере мы также собираемся позвонить MessageBoxA, чтобы мы могли видеть, как приложение что-то делает.

extrn ExitProcess : near 
extrn MessageBoxA : near 

Далее идет сегмент данных с сообщением «Hello World» для окна сообщения.

.data 
    hello db "Hello World!",0 

И, наконец, код. Он просто вызывает MessageBoxA, чтобы отобразить сообщение, а затем ExitProcess для выхода из приложения.

.code 

start: 

    push MB_ICONHAND or MB_OKCANCEL 
    push offset hello 
    push offset hello 
    push 0 
    call MessageBoxA   

    push 0 
    call ExitProcess 

end start 

Предполагая, что вы сохранили этот код в файле wintest.asm, вы бы затем скомпилировать его с помощью следующей командной строки:

tasm32 /ml wintest.asm 

Опция /ml указывает, что вы хотите использовать чувствительные к регистру символы. Без этого вызовы функций Windows не будут найдены компоновщиком.

Если вы получаете ошибку о невозможности найти windows.inc включаемый файл, вы можете также необходимо включить /i вариант с путем к Борланду включает каталог.

Наконец, вы связываете с помощью следующей командной строки:

ilink32 wintest.obj,,,import32.lib,, 

import32.lib является библиотека импорта, которая связывает код с Windows API.

Предполагая, что все скомпилировано и связано успешно, вы должны иметь приложение Windows под названием wintest.exe, которое при запуске откроет окно сообщения, но не откроет окно консоли.

+0

Прежде всего, спасибо за ваш ответ. Когда я пытаюсь выполнить его, я получаю некоторую ошибку. В начале это действительно дало мне ошибку о файле windows.inc. то я сменил команду на этот c: \ tasm \ bin \ tasm32/ml /ic:\tasm\include\windows.inc wintest.asm, но он все еще не работает. Он показывает мне эту ошибку: "* * FATAL ** Недопустимый аргумент после/wl ".. что мне нужно делать? – Aviv

+0

Параметр '/ i' должен быть чем-то вроде'/ic: \ tasm \ include' - без пробела после 'i', и вам нужен только путь к каталогу, а не файл * windows.inc *. –

+0

Я забрал его и теперь он дает мне ошибку ** ** FATAL ** Не удается найти файл: asm.ASM ** .. – Aviv