【问题标题】:Stopping an assembly program from exiting and closing the console window停止汇编程序退出和关闭控制台窗口
【发布时间】: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,hltpause 指令效率更高,尽管这取决于仿真级别并且可能不值得。
  • @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


【解决方案1】:

窗口关闭的事实并不取决于您的程序,而是您用来启动它的环境(例如 IDE)。应该修改 IDE 的设置,以使已完成程序的窗口保持打开状态,直到用户明确关闭它。

为了保持窗口打开而在最后挂起无限循环是一种不好的做法。这样的“黑客”会造成不良习惯。在实践中,它打破了非交互式控制台程序的常见约定。例如,一个挂起的程序不能用于自动化测试,它的输出不能被重定向等等。

更好的选择是打开一个单独的 shell 窗口(CMD.EXE 或 Powershell,因为我怀疑你在 MS Windows 中运行它),将当前工作目录更改为程序的二进制文件所在的位置。如果您的文件名为prg.com,则只需说明其名称即可在该窗口中执行它:

c:\dir\> prg.com
Hello, World!
c:\dir\> 

执行后,输出将停留在窗口中。在任何情况下,绕过任何 IDE 使用命令 shell 是任何汇编程序的基本技能,因此我建议尽早弄清楚。

【讨论】:

  • 例如,如果这是windows,那么只需运行“命令提示符”,这是一个dos控制台窗口,然后从那里运行测试程序。请注意,64 位版本的 windows 不能直接运行 16 位程序,因此您需要类似 dosbox 或运行 32 位版本 windows 或 16 位 msdos 的虚拟电脑。
  • 这不适用于任何 64 位 Windows(如上所述)。 OP 可能正在使用旧版本的 Windows,或者他们可能正在使用模拟器。在后一种情况下,他们可能别无选择,只能挂起。
  • > 别无选择,只能挂起——在选择不好的选项之前,必须探索其他选项。 HLT 是一个更好的选择。
  • 带有 CLI 的 HLT 并不比 JMP $ 好多少
  • 100% 同意,正确的解决方案是配置一次您的开发环境,而不是在您编写的每个程序中都添加愚蠢的废话。例如,使用具有在程序退出后保持打开的选项的终端仿真器。例如[urxvt -hold -e ./my_prog],或 Windows 上的任何等效项(可能是 urxvt 的 Windows 端口;我知道 Cygwin 有一个 RXVT)。
猜你喜欢
  • 1970-01-01
  • 2017-03-29
  • 2014-02-17
  • 2013-08-04
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多