【问题标题】:Was there ever 8-bit memory addressing in the original 16-bit x86?最初的 16 位 x86 中是否有 8 位内存寻址?
【发布时间】:2022-10-24 18:38:30
【问题描述】:

在实模式和 32 位保护模式下,16 位寻址用于通过 ModR/M 字节引用内存。此寻址仅在使用传统前缀的 i386 指令中受支持,在 x86-64 指令中完全不支持。

但是,ModR/M 字节也被 8 位特定操作码使用,这让我怀疑 8 位寻址是否存在于原来的16 位 x86 指令集。尽管 8 位地址非常有限,但完全有可能以与具有不同操作码的 16 位指令相同的样式对此类指令进行编码。

例如,而不是

add (bx, si), ax

你会有

add (bl, dh), al

很难找到任何 pre-i386 文档,所以我一无所知。这曾经支持过吗?

【问题讨论】:

  • FWIW,我不相信。没有人说过“256 字节对任何人来说都应该足够了”;)
  • 不,寻址是 a16、a32 或 a64。没有 a8 寻址大小。唯一类似的是xlatb,它从byte [ds:rbx/ebx/bx+al] 加载。
  • 8088/86 文档很容易找到原始 iapx88 书的 pdf。我得到了pdf,也可以在亚马逊上以八美元的价格购买原件。嗯,8 美元来自英特尔通过亚马逊销售,二手卖家 5 美元......如果你得到正确的 pdf,即使它是扫描的,你也可以进行文本搜索......
  • 20 位地址,不包括 i/o vs mem 信号。段/偏移量,偏移 4 位。这是在英特尔开始将它们分成两本书之前,一本用于硬件,一本用于软件。
  • bitsavers.org 是一个很好的历史文档来源。 Here 例如是 8086 用户手册。您可能还对Retrocomputing Stack Exchange 感兴趣。

标签: assembly x86 x86-16 addressing-mode


【解决方案1】:

仅通过XLAT,有效地执行mov al, [bx + al](即不是可编码为mov)。

现代 16 位实模式使用与 8086 相同的机器代码格式,这就是向后兼容的含义。 (只有非常小的差异,比如现在指令长度限制为 15 个字节,而 8086 会愉快地获取无限数量的前缀,即使这意味着将 IP 包装在一个充满 rep 前缀的 64k 段内。 )

NASM x86 16-bit addressing modes 列出了所有 ModRM 模式:它们只包括 16 位寄存器。

add [bx + si], al 是可编码的(如 00 00),但 add [bl + dh], al 不是。

如果您想查看历史文件,可以使用 8086 手册的 PDF 格式。此外,8086 的 ISA 的主要架构师 Stephen Morse 写了一本书“8086/8088 入门”,现在可以在他的网站上免费获得:https://stevemorse.org/8086/

8086 的早期祖先,例如只有 8 位寄存器的 8080,are not x86 CPUs


有关的:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-18
    • 2011-01-29
    • 2016-03-07
    相关资源
    最近更新 更多