繁体   English   中英

在64位Windows上使用16位汇编程序?

[英]16-bit Assembly on 64-bit Windows?

我决定不久前开始学习汇编,所以我开始使用FASMW进行16位汇编。 但是,最近我有一台真正的新计算机运行Windows 7 64位,现在该程序组装的已编译.COM文件都不再起作用。 他们给出一条错误消息,指出.COM与64位Windows不兼容。 32位程序集仍然可以工作,但是我宁愿从16开始并按自己的方式工作...是否可以在Windows 7上运行16位程序? 还是有一种特定的方式来编译它们? 还是我应该放弃并跳到32位?

无法使用16位汇编的原因是因为16位子系统已从所有64位版本的Windows中删除

解决此问题的唯一方法是安装DOSBox之类的东西,或安装VirtualBox之类的虚拟机软件包,然后在其中安装FreeDOS。 这样,无论如何您将获得真正的DOS。 NTVDM不是真正的DOS

就个人而言,我会鼓励为DOS编写16位程序集吗? 不。我会使用32位甚至64位汇编程序-原因是针对不同的操作系统(称为ABI)存在一组不同的函数调用。 因此,用于64位linux应用程序的ABI与32位应用程序不同。 不知道Windows是否如此。 但是,我保证中断的含义可能有所不同。

此外,使用16位汇编程序还需要考虑各种因素,例如正在使用的内存模型。 我可能是错的,但是我相信DOS可以为您提供64K的内存来玩“就是这样”。 据我了解,所有内容,整个堆和堆栈以及代码都必须适合此空间,这使您想知道任何事情实际上是如何工作的。

我的建议是只编写32位代码。 虽然最初看起来似乎应该学习如何编写16位代码,然后再“学习”为32位代码,但实际上我会说相反,这是事实:编写32位代码实际上更容易因为相当多的任意体系结构约束(例如,关于可以用作基址寄存器的约束)基本上都用32位代码处理了。

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

默认情况下,32位Windows 7和更早版本包含/启用NTVDM。 在32位Win8 +上,可以在Windows功能中启用它

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

长模式下的内核不能使用vm86模式提供虚拟8086实模式环境。 这是AMD64 / x86-64体系结构的局限性。

在运行64位内核的情况下,CPU以16位模式本机运行的唯一方法是16位保护模式(是的,这是存在的;不,没有人使用它,并且AFAIK主流OS无法提供一种方法来实现)。用它)。 或者让内核将CPU从长时间模式切换回传统模式,但64位内核则不这样做。

但是实际上,借助硬件虚拟化(VirtualBox,Hyper-V或使用Intel VT-x或AMD SVM的任何软件),无论该VM是否以16位实模式运行, 64位内核都可以作为整个虚拟机的管理程序。或运行32位操作系统(例如Windows 98或2000),然后可以使用vm86模式运行16位实模式可执行文件。

尤其是在64位内核上, 完全模拟16位PC(就像DOSBOX一样)通常更容易 ,而不是使用硬件虚拟化来本地运行常规指令,而是捕获直接的硬件访问( in / out ,加载/存储到VGA内存等)以及可以进行DOS系统调用/ BIOS调用/任何操作的int指令。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM