首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >16位asm指令集

16位asm指令集
EN

Stack Overflow用户
提问于 2011-09-29 21:25:02
回答 3查看 2.2K关注 0票数 7

在COM文件中使用哪组指令?我以为是8086,但看起来我错了。在我发现的8086手册中,shl只能接受1或cl作为它的第二个参数,而不是1的立即值对我来说很好。如果重要的话,我使用NASM。

耽误您时间,实在对不起。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-29 22:28:13

这是一个有趣的问题,一如既往,答案具有误导性。

一个真正的DOS文件没有头,必须放在一个单独的内存段中,因为它没有重定位信息,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兼容的命令来确保这一点。

如果上面的话听起来像皮塔,那是因为它是,我记得:)这也是为什么.EXE格式非常流行的原因。

票数 9
EN

Stack Overflow用户

发布于 2011-09-29 21:53:36

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

票数 7
EN

Stack Overflow用户

发布于 2011-09-29 22:01:44

COM文件主要有两种类型。一种是在MS-DOS下运行的,另一种是在CP/M OS下运行的。据我所知,DOS文件应该是基于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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7597988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档