【发布时间】:2018-03-27 14:50:07
【问题描述】:
org 100h
mov dx,msg
mov ah,9
int 21h
mov ah,4Ch
int 21h
msg db 'Hello, World!',0Dh,0Ah,'$'
所以,我有这个简单的“你好,世界!”带有.com 扩展名的程序集。每当我运行它时,Hello World! 确实会显示,但它会立即关闭窗口,甚至半秒后都不会!在单击命令提示符窗口的X 按钮之前,是否有任何可能的方法来阻止程序退出?
【问题讨论】:
-
jmp $可以。这是一个(非常大腿)永无止境的循环。将xor ah, ah / int 16h放在循环中也可以,并且模拟器可能会更好地容忍它。如果您不严格限于 8086,hlt或pause指令效率更高,尽管这取决于仿真级别并且可能不值得。 -
@MargaretBloom 用无限循环挂起一个程序是一种不好的做法,我看到很多学生很早就学会了。最好解释如何正确设置开发环境,以便在需要时保持打开窗口,而不是教人们编写打破基本假设的代码。非交互式控制台程序的一个基本假设是它完成了。任何无限期阻塞的
getch()也是如此。适当的退出技术,例如调用适当的 API 或(对于裸汇编程序)停止 CPU 更合适。 -
@GrigoryRechistov 问题中没有开发环境。 Windows 已经很久不支持 16 位 WOW 了。你假设太多了。虽然我同意你必须配置你的环境,但我们不知道 OP 正在使用什么。如果您不挂起它们,某些仿真器只会在窗口中闪烁输出。 OP 已经调用了正确的 API。
-
@MargaretBloom 请给我一个设计如此糟糕的模拟器的例子,这样我就可以将它用于我的学生作为一个例子,一个不能做的事情。立即关闭控制台的dos应用程序模拟器,就是这样。这种模拟器只是一个外部应用程序的 IDE 更有可能以这种方式运行,尤其是当它们主要用于启动交互式 GUI 应用程序时,而不是非交互式的东西。
-
这真的取决于@GrigoryRechistov :例如,如果您在Linux 上使用DOSEMU 并且不使用(或不能)
-dumb选项并且您启动像dosemu progname.exe这样的程序输出窗口将出现,程序运行,并将立即关闭。如果你使用WINE从wine progname.exe这样的命令行运行程序,它可能会启动DOSBOX并打开一个窗口,运行程序,然后立即关闭窗口。
标签: windows shell assembly nasm