我正在阅读有关内存寻址的内容。我阅读了有关段偏移的内容,然后阅读了有关描述符偏移的内容。我知道如何在实模式下计算确切的地址。这一切都可以,但我无法理解偏移量到底是什么?我到处读到:
在实模式下,寄存器只有16位,因此只能寻址
高达 64k。为了允许寻址更多内存,地址是
计算自segment * 16 + offset
.
在这里我可以理解第一行。我们有 16 位,因此我们最多可以寻址 2^16 = 64k。
但这第二行是什么?段代表什么?为什么我们要乘以16?为什么我们添加偏移量。我只是不明白这个偏移量是什么?有人可以解释一下或者给我这个链接吗?
当 Intel 构建 8086 时,机器中存在超过 64KB 的有效情况,但它不可能使用 32 位地址空间。那时,即使是一兆字节也是一大堆内存。 (还记得那句臭名昭著的名言“640K 应该对任何人来说都足够了”吗?这本质上是对当时 1MB 太可怕这一事实的误译huge.)“gigabyte”这个词在接下来的 15-20 年内不会被普遍使用,并且在之后的 5-10 年内它也不会指代 RAM。
因此,他们没有实现“永远”无法充分利用的巨大地址空间,而是实现了 20 位地址。他们仍然使用 16 位字作为地址,因为毕竟这是一个 16 位处理器。上面的词是“段”,下面的词是“偏移”。不过,这两个部分有相当大的重叠——“段”是一个 64KB 的内存块,从(segment) * 16
,并且“偏移量”可以指向该块内的任何位置。为了计算实际地址,您可以将地址的段部分乘以 16(或左移 4 位...同样的事情),然后添加偏移量。完成后,您就有了一个 20 位地址。
19 4 0
+--+--+--+--+
| segment |
+--+--+--+--+--+
| offset |
+--+--+--+--+
例如,如果段为 0x8000,偏移量为 0x0100,则实际地址为((0x8000 << 4) + 0x0100)
== 0x80100
.
8 0 0 0
0 1 0 0
---------------
8 0 1 0 0
不过,数学很少那么简洁——0x80100
可以用数千个不同的段:偏移组合来表示(4096,如果我的数学是正确的)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)