assembly - 16 位程序集与 64 位 Windows 7 不兼容

标签 assembly compatibility windows-7-x64 16-bit

我最近发现 64 位窗口无法运行 16 位应用程序(在本例中为 .com),因为 64 位窗口没有 16 位子系统(互联网上是这么说的)。我在尝试执行需要编辑的 .bat 文件时遇到了这个问题。

我对 x86 汇编有相当多的经验,但从未编写过在 Windows(或任何其他操作系统)下运行的程序。由于 x86 系列的向后兼容性,我从来没有真正关注过我的程序有多少位。只要它不使用未引入到程序必须运行的 CPU 中的指令,就可以了。

我的问题是:究竟是什么使代码成为 16、32 或 64 位,是什么触发了 16 位应用程序显然存在的不兼容问题?

是否可以反汇编小型 16 位应用程序并进行一些更改以使其正常工作,或者这确实是不明智的?

更新:我并不是在寻找一种运行此类应用程序的方法,即通过模拟器或其他程序,我可以自己解决。我只是想了解使 Windows 接受或拒绝程序的底层机制。

最佳答案

要运行“16 位应用程序”(在本例中是指 DOS 应用程序),Windows® 需要在 VM86 模式下设置任务。问题是,当 CPU 处于 32 位 VPAM(虚拟保护地址模式)(i386 操作系统使用的模式)时,此功能有效,但当 CPU 处于 AMD 推出的所谓“长模式”时,此功能无效。 amd64 CPU“长模式”仅支持运行32位和64位任务。

因此,64 位操作系统内核无法直接在 CPU 上运行 16 位任务,您始终必须使用某种模拟。如果您找到一个可以做到这一点的操作系统,它要么内置了该模拟,要么在 32 位模式而不是 64 位模式下运行,或者在 32 位和 64 位模式下运行并在之间愉快地切换我在某处读到过一些邪恶的、扭曲的黑客行为。

根据经验,使用 DOSBOX 是最好的选择。

编辑:Windows® 如何检测到它无法运行您的代码?

这很大程度上取决于检测到的程序类型。有它知道要处理的批处理文件(BATCMD)、PIF 文件(我认为它们仍然没有杀死它们),最后是 COMEXE 可执行文件。 COM 的情况很简单:最大 65280 字节。 16 位 MS-DOS® 程序,输出。另一方面,EXE 文件具有某些文件头:一个用于 16 位 DOS(或 Win3.x)部分(关键字:MZ),一个用于 32 位/64 位部分(LE、LX、PE(至少)、a.out 和 COFF 是此处的关键字,其中一些用于 OS/2 兼容性或仅用于 OS/2,一些用于各种 NT 变体)。

关于assembly - 16 位程序集与 64 位 Windows 7 不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19056069/

相关文章:

windows - 如何在 Windows 7 x64 上禁用 ASLR(地址空间布局随机化)?

java - 在一台 W7 机器上运行 Java 应用程序 (Salesforce DataLoader) 的多个实例?

testing - TEST ECX, 3 未测试 ECX 指向的值

assembly - 如何执行 MIPSEB-LE ECOFF 可执行文件?

c# - 如何在我的开发环境中从 Windows 7 x64 上的 C# 连接到 Oracle 数据库

Accordion 菜单的 jQuery 版本兼容性问题

android - 如何判断设备在 Google Play 商店中不兼容的原因

assembly - 将字符串转换为整数。使用 Nasm 的 x86 32 位汇编器

c - 链接内核 - 输入文件的 i386 架构与 i386 不兼容 :x86_64 output

javascript - 在哪个版本的 JavaScript 中为数组引入了括号表示法?