【问题标题】:16-bit Assembly on 64-bit Windows?64 位 Windows 上的 16 位程序集?
【发布时间】:2010-09-01 17:35:52
【问题描述】:

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

【问题讨论】:

  • 您始终可以为您的目标环境运行虚拟机。
  • 程序集是 处理器 特定的。你用的是什么处理器?你用的是什么处理器?
  • 像 Windows Virtual PC 这样的虚拟机。但是这个问题无论如何都是误导,因为没有从 16 位开始。 64 位模式要简单得多,并且与 32 位模式足够相似,因此您也不需要专门学习后者。更多位!= 更难
  • 相关:How to write hello world in assembler under Windows? 在 kernel32.dll 中调用 WinAPI 函数的 32 位示例

标签: windows assembly x86-64 x86-16 incompatibility


【解决方案1】:

您不能使用 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 内存来玩“就是这样”。一切,你的整个堆和堆栈以及代码都必须适合这个空间,据我所知,这让你想知道任何东西是如何工作的,真的。

【讨论】:

  • 关于 64K 内存是否足够的问题,您应该查看演示场景 -> demoscene.info
  • 不准确(但不是你的错)。它已被删除,因为它在长模式下无法正常工作。 en.wikipedia.org/wiki/Long_mode
  • 有趣,我没有意识到这是删除它的原因,我只知道它已被 Microsoft 分箱。就我而言,这不是一个坏举动,我们真的不应该再使用 WOW64 了。
  • 那么基于 DOS 的交叉编译器之类的东西会不再起作用吗?听起来是一个不去 64 位的好理由。我想知道为什么微软没有为 DOS 的东西提供一个仿真层?即使进行每条指令的模拟,它仍然可以让 DOS 软件在新机器上运行得比在为其编写它的机器上运行得更快。
【解决方案2】:

我的建议是只编写 32 位代码。虽然最初看起来学习如何编写 16 位代码,然后“毕业”到 32 位代码似乎是有意义的,但实际上我想说的恰恰相反:编写 32 位代码实际上更容易因为相当多的任意架构约束(例如,关于可以用作基址寄存器的内容)基本上在 32 位代码中消失了。

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

【讨论】:

  • +1,我要提到嵌入式,但从组装的角度来看,我对它的了解还不够。说得好学习曲线也是如此。
【解决方案3】:

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 位 protected 模式(是的,这存在;不,没有人使用它,并且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 调用/其他。

【讨论】:

    猜你喜欢
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2018-05-02
    • 2013-02-06
    相关资源
    最近更新 更多