在64位Windows上进行16位汇编?

时间:2010-09-01 17:35:52

标签: assembly incompatibility

我决定不久前开始学习装配,所以我开始使用FASMW进行16位装配。 HOwever,我最近得到了一台运行Windows 7 64位的新计算机,现在程序组装的所有已编译的.COM文件都不再有效。他们给出一条错误消息,指出.COM与64位窗口不兼容。 32位程序集仍然可以工作,但是我宁愿从16开始并继续工作...... 是否可以在Windows 7上运行16位程序?或者是否有特定的方法来编译它们?或者我应该放弃并跳过32位而不是?

3 个答案:

答案 0 :(得分:7)

您无法使用16位程序集的原因是因为所有64位版本的Windows中的16-bit subsystem has been removed

解决这个问题的唯一方法是安装像DOSBox这样的东西,或安装虚拟机程序包(如VirtualBox),然后安装FreeDOS。这样,无论如何你都会得到真正的DOS。 (NTVDM is not true DOS

就个人而言,我是否鼓励为DOS编写16位程序集?不。我使用32位甚至64位汇编 - 原因是不同的操作系统有一组不同的函数调用(称为ABI)。因此,64位Linux应用程序的ABI与32位不同。不确定Windows是否属于这种情况。但是,我保证中断的含义可能不同。

此外,您还可以使用16位汇编来考虑各种事项,例如正在使用的内存模型。我可能错了,但我相信DOS会给你64K的内存来玩“就是这样”。一切,你的整个堆栈和堆栈以及代码必须适合这个空间,正如我所理解的那样,这让你想知道它是如何工作的,真的。

答案 1 :(得分:6)

我的建议是只编写32位代码。虽然最初看起来似乎有必要学习如何编写16位代码,然后“毕业”到32位代码,但实际上我认为恰恰相反:编写32位代码实际上更容易因为相当多的任意架构约束(例如,你可以用作基址寄存器的东西)基本上都没有用32位代码。

就此而言,我认为对于是否有真正的理由来编写16位x86代码存在重大疑问。对于大多数实际用途而言,它是一个死平台 - 对于台式机而言,它严重已经过时,而对于嵌入式机器,您更有可能看到像ARM或Microchip PIC这样的东西。除非你有一个特定的目标并且确定它将是一个16位的x86,否则我可能会忘记它存在,就像世界上其他大多数人一样。

答案 2 :(得分:1)

32-bit Windows 7 and older include / enable NTVDM by default. On 32-bit Win8+, you can enable it in Windows Features

在64位Windows(或任何其他64位操作系统)上,您需要一个模拟器或完全虚拟化。

长模式中的内核不能使用vm86模式来提供虚拟8086实模式环境。这是AMD64 / x86-64架构的限制。

运行64位内核时,CPU在16位模式下本机运行的唯一方法是16位保护模式(是的,这是存在的;不,没有人使用它,并且AFAIK主流操作系统不提供使用它的方法)。或者让内核将CPU从长模式切换回传统模式,但64位内核不会这样做。

但实际上,通过硬件虚拟化(VirtualBox,Hyper-V或使用Intel VT-x或AMD SVM的任何东西), 64位内核可以成为整个虚拟机的虚拟机管理程序, VM以16位实模式运行或运行32位操作系统(如Windows 98或2000),而后者又可以使用vm86模式运行16位实模式可执行文件。

特别是在64位内核上,通常更容易完全模拟16位PC(如DOSBOX),而不是使用硬件虚拟化本地运行普通指令但是陷阱直接硬件访问(in / out,加载/存储到VGA内存等)和int指令进行DOS系统调用/ BIOS调用/等等。