繁体   English   中英

为什么在 Assembly x86 MASM 上使用“int 21h”会导致我的程序崩溃?

[英]Why does using "int 21h" on Assembly x86 MASM cause my program to crash?

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

mov ah,01h
int 21h

但它只是因为一个未处理的异常使我的程序崩溃。 根据我读过的很多内容,这似乎是这样做的方法,那么为什么它不适合我呢?

现在,我对这种语言还很陌生,所以我仍然不完全理解这段代码的工作过程,所以我也很欣赏通过按 Enter 和接受输入而无需用户按下来接受输入背后的逻辑进入。

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

您的代码看起来像 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 可执行文件,它们根本不应该调用中断 - 这是崩溃条件。

您需要获得一个可以生成 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 位工具集。

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

短剑

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM