【问题标题】:16 bit asm instruction set16位asm指令集
【发布时间】:2011-11-27 17:15:47
【问题描述】:

COM 文件中使用了哪些指令集?我以为是8086,但似乎我错了。在我发现的 8086 手册中, shl 只能接受 1 或 cl 作为其第二个参数,而 1 以外的直接值对我来说可以正常工作。以防万一,我使用的是 NASM。
感谢您的宝贵时间。

【问题讨论】:

    标签: assembly x86 16-bit


    【解决方案1】:

    这是其中一个有趣的问题,而且答案总是具有误导性。

    真正的 DOS COM 文件没有标头,并且必须适合单个内存段,因为它没有重定位信息,DOS 必须将文件放在需要的位置,因此唯一真正的兼容方式(与x86) 是使用 8086 兼容程序集。 编辑:为了澄清上述内容,这是因为 8086 没有内存页。

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

    有趣的是,这也是 COM 文件在 Windows7 x32 中不经常工作或在 Windows7 x64 中根本不工作的部分原因。

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

    长话短说;您可以使用当前系统可以支持的任何类型的命令,但您应该只使用与 16 位 x86 兼容的命令。

    如果上面听起来像 PITA,那是因为它是,我记得 :) 这也是 .EXE 格式迅速流行的原因。

    【讨论】:

    • 为什么是减一?我想我已经很清楚地回答了这个问题,并为他观察到的行为提供了证据?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      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

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

      【讨论】:

      • 它是与 186/188 一起添加的(以及 push immed 和 enter/leave)。
      • +1 用于提及 COM 格式的 CP/M 起源。它用于将 CP/M 应用程序轻松移植到 MS-DOS。
      猜你喜欢
      • 1970-01-01
      • 2019-04-20
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-16
      • 1970-01-01
      • 2023-02-05
      相关资源
      最近更新 更多