【问题标题】:Why does using "int 21h" on Assembly x86 MASM cause my program to crash?为什么在 Assembly x86 MASM 中使用“int 21h”会导致我的程序崩溃?
【发布时间】:2020-09-04 01:33:28
【问题描述】:

我试图让我的程序在用户无需按 Enter 的情况下接受输入,所以我尝试了以下操作:

mov ah,01h
int 21h

但它只是让我的程序因未处理的异常而崩溃。根据我读过的很多内容,这似乎是这样做的方法,那么为什么它对我不起作用?

现在,我对这门语言还很陌生,所以我仍然不完全理解这段代码的工作过程,所以我也很欣赏通过按 enter 接受输入并在没有用户的情况下接受输入背后的逻辑必须按回车。

顺便说一句,我的操作系统是 Windows。

【问题讨论】:

  • 我也在使用 Windows Visual Studio 2010。
  • 这是 20 年前每个人都停止编写的代码。 VS2010 不可用,不支持 16 位代码。在 32 位代码中使用 int 21h 总是会使您的程序崩溃。
  • 如果你真的想写DOS程序,就用DOSBox来运行吧。
  • 这基本上就是我所有的代码了,真的。

标签: windows assembly x86 dos masm


【解决方案1】:

您的代码看起来像 MS-DOS 时代的程序集。 VS2010 不支持生成 DOS 可执行文件,现代版本的 Windows(64 位类型)也不支持运行它们。看起来您正在浏览一些旧书或网站,它是在 80 年代末至 90 年代初写的。回到那个时候,组装作为一种工作技能更具相关性和市场价值。这些天没那么多,虽然一些组装知识不会有什么坏处。

决定你想学什么。如果您想学习现代程序集(并以 Windows 为目标),请获取一些最新的指导。这些技术完全不同,int21h 不在其中:) 如果您确实是在 DOS 时代汇编之后,请使用DOSBox 设置一个 DOS 虚拟机,并找到一些旧的免费汇编程序。 Visual Studio 2010 在这里帮不了你。生成 16 位可执行文件的最新版 Visual C++ 是 v1.5x。

具体为什么你的程序会崩溃。 Int21h 是 MS-DOS 公开其应用程序接口 (API) 的方式。 Windows 不支持它用于 Windows 可执行文件 - 还有其他调用 API 的方法。当您使用 Visual Studio 2010 进行组装时,您最终会得到一个 Windows 可执行文件,而不是 DOS 可执行文件,并且没有生成 DOS 可执行文件的选项。至于 Windows 可执行文件,它们根本不应该调用中断 - 这是一个崩溃条件。

【讨论】:

    【解决方案2】:

    您需要获得一个可以生成 16 个 MS-DOS 程序的工具集。这些应该在 DOSBOX 上运行,或者在安装了 MS-DOS 的虚拟 PC 上运行。 Microsoft 包括 16 位工具集,最高到 Visual C/C++ 1.52,但 Visual C/C++ 4.0 和 4.1 也包含 1.52 16 位工具集。旧版本的编译器将命名为 Microsoft C 8.xx 或更早版本。我不知道 Visual Studio 的早期版本(2002 或 2003)是否包含 16 位工具集。

    【讨论】:

      【解决方案3】:

      使用链接器版本 5.60 生成 16 位 DOS 应用程序。你可以从: http://download.microsoft.com/download/vc15/Update/1/WIN98/EN-US/Lnk563.exe

      德克

      【讨论】:

        猜你喜欢
        • 2021-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 2018-10-15
        • 2019-09-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多