6

这是代码:

.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 已停止工作” - 当它到达中断时总是正确的。

这是我试图使用的中断。它应该简单地退出程序。我尝试过的其他方法包括字符输入/输出等。没有任何效果。

我在 Windows 7 上,使用带有 WinAsm IDE 的 masm32。

有很多很酷的事情似乎我应该能够用中断来做......但是,每当我尝试使用中断时它就会崩溃 - 总是以同样的方式。

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

......但我真的无法从中弄清楚任何事情。

有什么建议么?

4

4 回答 4

6

是的。这种性质的中断专门用于 MS-DOS,因此在 Windows ME 和以前的版本中有效,但在 NT 体系结构上无效,除非在 DOS 模拟器 (command.com) 下。我不知道这是否仍然随 Windows 7 一起提供——我知道 x64 版本的 Windows 默认没有它。

如果您正在编写本机 NT 应用程序(如果您不知道它是什么,则不太可能这样做,但如果您想了解,请查看 Mark Russinovich 在 MSDN 上的博客)这里是 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。

于 2010-03-01T06:28:05.773 回答
3

除了@ninefingers 出色的答案 - 我可以添加 int 20H 仅适用于 16 位程序。并且永远不能被 .exe 使用

这里

于 2010-03-01T06:32:38.747 回答
3

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

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

于 2010-04-13T16:41:34.497 回答
0

在 32 位 Windows 下,有一个虚拟 86 模式,在这种模式下,可以使用来自 DOS 的旧 RM 软件中断,因为 Windows 模拟了很多中断。此外,如果我们为我们的 grafikcard 正确安装了驱动程序,则可以使用一些 int 10h 软件中断,例如在我们的卡上获取 vesabios 的 vesamodelist。是的,这是一个仿真,但它会从我们的卡中获取真实的模式编号及其环境参数,即使在 Windows 下无法更改所有这些 vesamode。

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

短剑

于 2013-05-05T16:01:34.763 回答