Jay*_*ung 5 assembly incompatibility
我决定不久前开始学习装配,所以我开始使用FASMW进行16位装配.HOwever,我最近得到了一台运行Windows 7 64位的新计算机,现在程序组装的所有已编译的.COM文件都不再有效.他们给出一条错误消息,指出.COM与64位窗口不兼容.32位程序集仍然有效,但是我宁愿从16开始工作......是否有可能在Windows 7上运行16位程序?或者是否有特定的方法来编译它们?或者我应该放弃并跳到32位而不是?
小智 7
您无法使用16位程序集的原因是因为已从所有64位版本的Windows中删除了16位子系统 .
解决这个问题的唯一方法是安装像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代码存在实质性问题.最实用的目的,它是一个死的平台-为台式机这是严重过时,并且为嵌入式机器,你就更有可能看到的东西像手臂或Microchip的照片.除非你有一个特定的目标并且确定它将是一个16位的x86,否则我可能会忘记它存在,就像世界上其他大多数人一样.