以下是代码:
.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
......但我真的无法从中找到任何东西。
有什么建议吗?
答案 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格式。
德克