16位asm指令集



COM文件中使用的指令集是什么?我以为是8086,但看来我错了。在我发现的8086手册中,shl只能接受1或cl作为其第二个参数,而除1以外的直接值对我来说很好。如果有关系,我使用NASM。
感谢您的宝贵时间。

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

一个真正的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格式很快变得非常流行的原因。

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

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

就SHL指令而言,似乎现代x86硬件(可能是x64)支持为该指令使用立即值。但是,在查看8086文档时,我找不到它的参考资料,所以它一定是在某个时候添加的。这里有几个参考资料,它们详细介绍了这个指令:

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

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

最新更新