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

时间:2010-03-01 06:11:47

标签: assembly crash interrupt low-level masm32

以下是代码:

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

结果:http://img705.imageshack.us/img705/3738/resultom.png

“test.exe已停止工作” - 当它到达中断时总是正确。

This is the interrupt I'm trying to use.它应该退出程序。我试过的其他人包括字符输入/输出等等。没有任何作用。

我在Windows 7上,使用masm32和WinAsm IDE。

有很多很酷的东西似乎我应该可以用中断...但是,每当我尝试使用中断时它都会崩溃 - 总是以同样的方式。

这看似相关且可能有用:DOS Interrupt in masm x86 assembly crashing

......但我真的无法从中找到任何东西。

有什么建议吗?

4 个答案:

答案 0 :(得分:5)

是的。这种性质的中断专门用于MS-DOS,因此在Windows ME和之前的版本中工作但除了DOS模拟器(command.com)之外不能在NT架构上工作。我不知道这是否还附带Windows 7 - 我知道x64版本的Windows默认没有它。

如果您正在编写Native NT Apps(如果您不知道它是什么,则不太可能这样做,但如果您想了解一下在MSDN上查看Mark Russinovich的博客),这里有一个列表NT中断及其相应的功能:http://www.ctyme.com/intr/rb-4249.htm

除此之外,您想要在Win32 API中调用函数:http://msdn.microsoft.com/en-us/library/aa383749%28VS.85%29.aspx

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

您可以做的一件事是安装虚拟机系统,如VirtualBox或VMware,然后安装FreeDOS。它根本不应占用大量RAM,并且可以让你自由地试验汇编/ dos。

答案 1 :(得分:2)

除了@ninefingers优秀的答案 - 我可以添加int 20H只适用于16位程序。永远不能被.exe

使用

请参阅here

答案 2 :(得分:2)

你必须小心编程中断。如果您使用的不是RealMode(16位),则通常无法达到CPU级别的中断。必须有一个中断描述符表来索引中断向量表。

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

答案 3 :(得分:0)

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

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

德克