16位asm指令集

Kar*_*elė 7 x86 assembly 16-bit

COM文件中使用了哪些指令集?我以为它是8086,但似乎我错了.在我发现的8086手册中,shl只能接受1或cl作为其第二个参数,而1以外的立即值对我来说工作正常.如果重要,我正在使用NASM.
谢谢你的时间.

Rus*_*rke 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格式非常流行的原因.


Bri*_*uch 7

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