段偏移方法是所有x86芯片通用的还是只有8086?

段偏移方法是所有x86芯片通用的还是只有8086?,x86,segment,X86,Segment,使用8086汇编语言编程中的逻辑地址引用内存。包括现代奔腾微处理器在内的所有x86芯片都具有此功能吗?所有32位x86机器都支持全套段寄存器和 通过它们访问内存。amd64/Intel 64芯片的性能仍然有限 支持,但删除了大部分分段功能 在受保护模式下,与实模式不同,段寄存器不受保护 不过,只是简单地缩放并添加到地址中;它们是索引 GDT或LDT(全局或本地描述符表),其中包含 描述基(起始地址)和大小的段描述符 限制,以及段的权限位。地址是 检查为小于限值并添加到指定基数,以及 根据权限位检

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

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

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

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


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

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

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

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

芯片仍然隐式使用段。代码从CS段获取(除非另有明确指示)。从DS段获取数据(除非另有明确指示,否则再次如此)。ES在许多操作中用于目的地(同样,除非……您知道演练)。堆栈通过SS等访问。然而,32位处理器(80286之后)上的许多操作系统(甚至可能全部?)只是将所有段映射到同一内存空间,从而模仿平面地址空间布局。如果您为Windows NT或更高版本编写程序,或者为Linux系统或类似系统编写程序,那么您可能根本不会考虑段


AMD64指令又是不同的,基本上是完全消除段的一个步骤。在这种环境中,通常使用寻呼系统进行保护。

很遗憾,8086中缺少段寄存器导致人们不喜欢按比例分段寻址,因为它过去是一个好主意,现在仍然是一个好主意;与使用64位线性指针相比,使用32位缩放段加32位偏移量的组合可以更有效地处理需要4GB到64GB存储空间的面向对象应用程序(如果所有对象都与16字节边界对齐,则对象引用只需为4字节,而不必为8字节)。只要有一点额外的硬件,“有效寻址”范围就可以扩展到1 TB或更多。从实用角度来看,除了缺少段寄存器外,唯一的问题是:(1)为了实现分段体系结构的最大优势,对象从段边界开始;当8086问世时,这种舍入浪费的空间被认为是令人讨厌的;(2) 很难使用64K以上的单个逻辑对象。在当今世界,将对象四舍五入到16字节并不是一个很大的损失,并且必须细分大于4GB的对象不会像细分大于64K的对象那样成为一个问题。