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

Eri*_*rik 4 assembly compatibility 16-bit windows-7-x64

我最近发现64位窗口不会运行16位应用程序(在这种情况下为.com),因为64位窗口没有16位子系统(或者互联网上说的那样).当我尝试执行一个调用EDIT的.bat文件时,我遇到了这个问题.

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

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

有可能拆卸小型16位应用程序并改变一点以使其正常工作,还是真的不明智?

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

mir*_*los 6

要运行"16位应用程序"(在本例中为DOS应用程序),Windows®需要在VM86模式下设置任务.问题是,当CPU处于32位VPAM(虚拟保护地址模式)时,这是有效的,这是i386操作系统使用的,但不是当CPU处于AMD引入的所谓"长模式"时.amd64 CPU"长模式"仅支持运行32位和64位任务.

因此,64位操作系统内核无法直接在CPU上运行16位任务,您必须始终使用某种仿真.如果您发现可以执行此操作系统的操作系统,它可以内置该仿真,或者以32位模式而不是64位模式运行,或者在32位和64位模式下运行并在两者之间快速切换他们在某种邪恶,扭曲的黑客,我读过某个地方.

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

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

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