2

在 8086 中使用汇编语言编程中的逻辑地址来引用内存。此功能是否适用于所有 x86 芯片,包括现代奔腾微处理器?

4

3 回答 3

3

所有 16 位和 32 位 x86 行(8086、8088、80186、80286、80386、i486、奔腾等)都使用某种形式的段/偏移寻址。然而,该段所指的确切内容从 8086/88/186 线路到 80286 以后的线路发生了巨大变化。

在早期的芯片中,没有虚拟寻址,段指的是 20 位内存地址的高 16 位,而偏移量是 16 位偏移量。这意味着您有 1MB 的直接可寻址内存通过一组高度重叠的 64KB 块访问。

后来的“保护模式”芯片大大改变了这一点。段不再仅仅是物理地址的高 16 位,而是现在成为两个查找表(GDT 或 LDT)之一的索引,其中包含指向基地址、大小限制、保护权限等的内存结构.段的。偏移量从该存储的基地址开始工作,并根据大小限制器进行检查,以确保您不会访问它之外的内存,从而确保必须明确设置重叠地址(如果有)而不是隐式重叠早期的芯片组。80286 仍然有大小限制为 64KB 的段,但 80386 和后来完全摆脱了这一点。

段仍然被芯片隐式使用。代码从 CS 段中获取(除非另有特别说明)。数据是从 DS 段中提取的(除非另有特别说明)。ES 用于许多操作中的目的地(同样,除非......你知道演习)。通过 SS 等方式访问堆栈。然而,32 位处理器(80286 后)上的许多操作系统(甚至可能全部?)只是将所有段映射到相同的内存空间,从而模仿平面地址空间布局。如果您为 Windows NT 或更高版本编程,或者如果您为 Linux 系统或类似系统编程,您可能根本不考虑分段。

AMD64 指令再次不同,基本上是朝着完全消除段迈出的一步。它通常是用于在该环境中进行保护的寻呼系统。

于 2011-02-02T05:45:04.880 回答
2

通过 32 位保护模式,所有寻址仍然使用段寄存器——但在几乎每个 32 位操作系统中,四个主段寄存器设置为基地址为 0,限制为 4 GB,因此它们'基本上都是“通过”。所有地址转换都是通过分页单元完成的。

在 64 位模式下,大多数其他选项(无论如何都没有人使用)被简单地删除。段仍然在有限的程度上被使用(主要是在 64 位模式和兼容模式之间切换),但仅此而已。

于 2011-02-02T05:34:41.767 回答
1

所有 32 位 x86 机器都支持完整的段寄存器集并通过它们访问内存。amd64/Intel 64 芯片的支持仍然有限,但删除了大部分分段功能。

然而,在保护模式下,与实模式不同,段寄存器不是简单地缩放并添加到地址中;它们是 GDT 或 LDT(全局或局部描述符表)的索引,其中包含描述基数(起始地址)和大小限制的段描述符,以及段的权限位。检查地址是否小于限制并添加到指定的基数,并根据权限位检查访问。

于 2011-02-02T05:24:33.560 回答