0

If I've built a program in assembly language, how can I force it to run in background(Without any console)? The program is endless so the console is appearing all the time..

Is there a solution for it, or some interrupt that let me doing this?
Thanks to everyone.

EDIT: I'm using Tasm Compiler,& my Operating System is windows 7 (32bit)

4

3 回答 3

3

如果您不想有控制台窗口,则必须将您的程序与您的程序链接。/SUBSYSTEM:WINDOWS 您可以参考MSDN了解各种选项。

但这并不是与汇编相关的真正问题,因为这同样适用于您创建的任何其他可执行文件。

于 2013-06-27T08:31:24.990 回答
2

诀窍在于您需要创建一个 Windows 应用程序而不是控制台应用程序。如何做到这一点最好用一个最小的示例应用程序来演示。

我们从设置内存模型开始。

.386
.model flat

然后我们包括windows.inc它使我们能够访问 API 调用中可能需要的各种常量。如果您对 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带有 Borland 包含目录路径的选项。

最后,您链接到以下命令行:

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

import32.lib是一个将您的代码链接到 Windows API 的导入库。

假设一切都已成功编译和链接,您现在应该有一个名为wintest.exe的 Windows 应用程序,运行时会弹出一个消息框,但不会打开控制台窗口。

于 2013-06-27T08:42:01.063 回答
1

如果您使用的是 Linux/Unix,请使用daemonize 。

于 2013-06-26T21:04:15.757 回答