Assembly 为什么每次我尝试使用中断时,我的masm32程序都会崩溃?

Assembly 为什么每次我尝试使用中断时,我的masm32程序都会崩溃?,assembly,crash,interrupt,low-level,masm32,Assembly,Crash,Interrupt,Low Level,Masm32,代码如下: .386 ;target for maximum compatibility .model small,stdcall ;model .code main: int 20h END main 结果: “test.exe已停止工作”-在达到中断时始终正确 它应该简单地退出程序。我尝试过的其他方法包括字符输入/输出等。。什么都不管用 我在Windows7上,在WinASMIDE中使用masm32 有这么多很酷的事情,似乎我应该可以做的中断。。。然而,每当

代码如下:

.386 ;target for maximum compatibility
.model small,stdcall ;model
.code
    main:
        int 20h
    END main
结果:

“test.exe已停止工作”-在达到中断时始终正确

它应该简单地退出程序。我尝试过的其他方法包括字符输入/输出等。。什么都不管用

我在Windows7上,在WinASMIDE中使用masm32

有这么多很酷的事情,似乎我应该可以做的中断。。。然而,每当我试图使用中断时,它就会崩溃——总是以同样的方式

这似乎相关且可能有用:

…但我还没能从中找出什么


有什么建议吗?

是的。这种性质的中断是专门针对MS-DOS的,因此在Windows ME和previous中工作,但在NT体系结构中不工作,除非在DOS仿真器(command.com)下工作。我不知道这是否仍然与Windows 7一起提供-我知道默认情况下x64版本的Windows没有它

如果您正在编写本机NT应用程序(如果您不知道它是什么,则不太可能这样做,但如果您想了解,请查看Mark Russinovich在MSDN上的博客),以下是NT中断及其相应功能的列表:

除此之外,您还需要调用Win32 API中的函数:

编辑:在该代码示例中,您没有通过寄存器为中断指定任何选项。哦,如果你是为DOS而不是Windows组装的话,你可以让它工作。如果您使用链接器,则可能会创建一个Windows PE可执行文件。但是,如我所说,如果您在64位Windows上,请不要尝试


您可以做的一件事是安装一个虚拟机系统,如VirtualBox或VMware,然后安装FreeDOS。它应该不会占用太多内存,并且可以让您自由地试验汇编/dos。

除了@ninefingers外,还有一个极好的答案-我可以添加int 20H吗?它只适用于16位程序。并且永远不能被.exe使用


请参阅。

您必须小心编程中断。如果您处于RealMode(16位)以外的任何状态,则通常无法在CPU级别达到中断。中断描述符表必须可用于索引中断向量表


IVT位于环0中,您可以直接、不受阻碍地访问硬件(CPU、视频等)。所有应用程序都将在环3中运行(包括操作系统)。IDT包含IVT的索引。这样做是为了保护您的硬件。如果您想从操作系统访问中断,您需要确保32位源可以使用这些中断。

在32位Windows下,有一个虚拟86模式,使用此模式可以使用DOS中的旧RM软件中断,因为Windows模拟了很多中断。 此外,如果我们已经为grafikcard正确安装了驱动程序,则可以使用一些int 10h软件中断,例如,获取卡上vesabios的vesamodelist。是的,这是一个模拟,但是它从我们的卡中获得了真实的modenumber和它们的环境参数,如果在windows下无法更改所有这些vesamodes的话

16位DOS应用程序也可以使用*.exe格式,但这是MZ格式,而不是PE格式


德克

谢谢九位天使,我想这是有道理的。我肯定会研究虚拟机,这可能是个好主意!而且,我使用的中断没有任何选择(我不认为有任何选择),所以这不会是一个问题。