16位汇编指令集

8

COM文件使用哪个指令集?我一开始以为是8086,但似乎我错了。在我找到的8086手册中,shl只能接受1或cl作为第二个参数,而对于我来说,除了1之外的立即值都可以正常工作。如果有影响的话,我正在使用NASM。
谢谢你的时间。

3个回答

10

这是一个有趣的问题,但答案常常会误导人。

真正的DOS COM文件没有头部,并且必须适应单个内存段,因为它没有重定位信息,所以DOS必须将文件放在需要的位置,因此与x86兼容的唯一真正方式是使用8086兼容汇编语言。 编辑:为了澄清上面的内容,这是因为8086没有内存页面。

你当然可以编译286/386操作码,因为一旦程序运行,DOS中没有执行运行时可以阻止你并说“不,你不能这样做,这是386指令”。

有趣的是,这也是COM文件在Windows7 x32中很少工作或根本不起作用的部分原因。

由于DOS的工作方式,当您执行您的.com文件时,command.com被卸载,然后重新加载,因此您的.com文件实质上可以访问系统的所有内存,并在理论上使用DOS的内存扩展器,如Phar lap的DOS/4GW和CWSDPMI。

长话短说; 您可以使用当前系统支持的任何命令,但是为确保兼容性,应仅使用16位x86兼容命令。

如果以上内容听起来很麻烦,那是因为它确实很麻烦,我还记得:) 这也是.EXE格式非常快速变得流行的原因。


1
为什么减一?我认为我已经相当清楚地回答了问题,并提供了他观察到的行为的证据? - Russ Clarke

7

真正的COM(我不会讨论那些实际上是EXE等的COM)只意味着它是一个简单的DOS可执行文件。支持的任何指令集都可用。我曾经在8088到i486时代做过DOS编程(包括COM和EXE),无论哪种模式下合法的指令,都可以使用。例如,当我的目标是“16位”(技术上应该称为“实模式”)DOS时,我经常使用32位字符串指令和立即推送。


4

COM文件有两种主要类型。一种是设计用于在MS-DOS中运行,另一种是设计用于在CP/M操作系统中运行。据我所知,DOS COM文件应该基于x86。根据维基百科的说法,CP/M COM文件可能是8085、8080或Z80指令。正如另一个答案提到的那样,COM只是一种简单的可执行格式,可以使用任何支持的底层指令集。

就SHL指令而言,现代x86硬件(可能是x64)似乎支持使用立即值进行此指令。当我只查看8086文档时,我找不到相关参考,因此它必须在某个时候被添加。以下是一些详细介绍此指令的参考资料:

http://siyobik.info/main/reference/instruction/SAL%2FSAR%2FSHL%2FSHR

http://ref.x86asm.net/coder32.html


3
它是在186/188指令中添加的(同时也包括push immed和enter/leave指令)。 - Brian Knoblauch
2
提到COM格式的起源是CP/M,这是一个值得赞赏的地方。它被用于将CP/M应用程序轻松移植到MS-DOS平台上。 - starblue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接