【问题标题】:Difference between memory location and memory segment内存位置和内存段的区别
【发布时间】:2014-07-30 03:12:18
【问题描述】:

x86 架构内存位置的大小为 8 位,内存段为 16 位。 内存位置和内存段有什么区别?

【问题讨论】:

  • 您所说的"location"是指offset吗?顺便说一句,它不是 8 位;地址的偏移部分是 16 位或 32 位(在 IA-32 上)。请参阅英特尔软件开发人员手册第 1 卷中名为“32 位和 16 位地址和操作数大小”的部分。
  • 但是结合段部分和偏移部分,我们可以用 8 位寻址一个内存位置。
  • 哦,我想我误解了这个问题。问题中的位置是可寻址内存中的单个字节(?)。因此,假设 16 位实模式,您将从 segment * 16 + offset 获得一个 20 位地址,这允许您寻址 1MB 范围内的任何字节。

标签: assembly architecture x86


【解决方案1】:

分段是 Intel 发明的方法/机制,它将 16/32 位 CPU 物理地址扩展为某个内存位置的 4 位。因此,如果 CPU 是 16(32) 位,则指向某个内存位置的地址的实际大小是 20(36) 位长并且被计算:

PhysicalAddress = Segment * 16 + Offset

另请查看:Real mode memory addressing explaination

【讨论】:

    【解决方案2】:

    您所指的 16 位内存段是段寄存器的宽度。您问题中内存位置的 8 位宽度是每个内存地址增量的数据量。大多数 CPU 以 8 位增量寻址内存,但这不是普遍规律 - 存在每个内存增量具有不同数据宽度的 CPU。后者的意思是“如果要访问 32 位字表中的下一个元素,则必须将内存地址偏移 32/8 = 4 个地址”。前者,段寄存器大小,是从 CPU 寄存器通常不超过 16 位宽的时候遗留下来的。因此,当用作内存指针时,只能寻址 64k * 每个内存位置的位数。 64 KiB,就是这样。这些段寄存器本质上引入了一个 64 KiB 的窗口,可以在内存空间中移动,从而允许访问更多的内存。只是不是所有的同时。通过写入这些段寄存器,相应地设置 64 KiB 窗口的位置。由于这些寄存器是 16 位宽的,我们可以有 64k 个内存位置,这样一个 64 KiB 窗口开始。结果,它们重叠。 “段寄存器”这个名字有点含糊,因为每个段寄存器增量的 16 字节部分被称为“段落”。希望增加了混乱。

    注意:这都与 x86“实模式”有关,与“过时模式”相同。直到 8086,这是 CPU 知道的唯一模式。后代引导到该模式,以保持兼容性。

    【讨论】:

      猜你喜欢
      • 2021-11-18
      • 1970-01-01
      • 2011-11-23
      • 2016-08-29
      • 2014-06-07
      • 2014-06-28
      • 2010-11-04
      • 1970-01-01
      • 2013-01-22
      相关资源
      最近更新 更多