COM文件中使用了哪些指令集?我以为它是8086,但似乎我错了。在我发现的8086手册中,shl只能接受1或cl作为其第二个参数,而1以外的立即值对我来说工作正常。如果重要,我正在使用NASM 谢谢你的时间。
答案 0 :(得分:9)
这是一个有趣的问题,而且一如既往,答案会产生误导。
一个真正的DOS COM文件没有标题,并且必须适合单个内存段,因为它没有重定位信息,DOS必须将文件放在需要的地方,因此唯一真正的兼容方式(与x86)是使用8086兼容组件。 编辑:为了澄清上述情况,这是因为8086没有内存页面。
你当然可以在286/386操作数中编译,因为一旦程序运行,DOS中就没有执行运行时阻止你说“不,你不能这样做,这是一个386指令”。
有趣的是,COM文件在Windows7 x32中或在Windows7 x64中完全不能正常工作的部分原因。
由于DOS工作方式,执行.com文件时会卸载command.com,然后重新加载,因此基本上你的.com文件可以访问系统的所有内存,理论上使用DOS内存扩展器,如Phar lap的想到DOS / 4GW和CWSDPMI。
长话短说;您可以使用当前系统可以支持的任何类型的命令,但您应该只使用16位x86兼容命令。
如果以上听起来像是PITA,那是因为它是,我记得:)这也是为什么.EXE格式非常受欢迎的原因。
答案 1 :(得分:7)
一个真正的COM(我不会进入实际上是EXE的COM等)只是意味着它是一个简单的DOS可执行文件。无论支持哪种指令集都可用。我过去常常在8088上通过i486进行DOS编程(COM和EXE),无论在该模式下哪些指令合法,你都可以使用。例如,当我的目标是“16位”(技术上应该称为“实模式”)DOS时,我经常使用32位字符串指令和立即推送。
答案 2 :(得分:4)
有两种主要类型的COM文件。一个被设计为在MS-DOS中运行,另一个被设计为在CP / M OS中运行。据我所知,DOS COM文件应该是基于x86的。根据维基百科,CP / M COM文件可能是8085,8080或Z80指令。正如另一个提到的答案,COM只是一种简单的可执行格式,可以使用任何支持的底层指令集。
就SHL指令而言,现代x86硬件(可能是x64)似乎支持对该指令使用立即值。但是,在查看8086文档时,我找不到它的引用,所以它必须在某个时候添加。这里有一些参考资料,详细介绍了这条指令:
http://siyobik.info/main/reference/instruction/SAL%2FSAR%2FSHL%2FSHR