physical address=16*selector+offset
但我不知道为什么选择器乘以 16?
4 回答
为了与 Z80 “程序员兼容”,但仍能使用超过 64 kiB 的内存,早期的英特尔处理器引入了内存分段。在添加到 16 位偏移量之前,16 位段将被左移 4 位(意味着乘以 16,而不是您的问题声称的 64),从而产生 20 位地址。
对于习惯了 Z80 的程序员来说,只需要使用操作系统提供的段,他们就可以随意使用给定的 64 KB 偏移量。新程序员可以对段进行更复杂的操作,允许他们访问 1 MiB 的地址空间(IBM PC 将其减少到 640 kiB,但出于他们自己的原因)。
8088/8086 的目标是提供一种方法,使 16 位处理器可以拥有 1 兆字节的寻址空间,而程序员不必将地址空间划分为 64K 块并担心地址是否跨越它们之间的边界。尽管它受到了很多诽谤,但它实际上比我见过的任何其他处理超过寄存器大小的地址的方法都要好。在数据自然细分为 64K 或更少的项目的情况下,它通常相对轻松地工作,并且可以接受填充项目以从 16 字节边界开始。乘以 16(而不是更大或更小的数字)可能是任意的,但在以十六进制表示法列出事物时,它很方便,
8088 分段设计的唯一主要缺陷是:
- 两个通用分段寄存器还不够“完全”。一种常见的模式是“将数据从一个对象复制到另一个对象,使用第三个对象进行翻译”;只有当其中一个对象存在于代码段或堆栈中时,该模式才能有效地实现。不幸的是,直到 80386 才解决此问题,通常的做法是忽略段。
- 没有任何好的方法可以对段寄存器进行任何类型的算术运算。从 DS 或 ES(或 FS 或 GS)中添加或减去 0x1000 的指令,无论是否设置了进位或无条件地——总共八个(或十六个)操作码——将极大地促进段处理。
- 应该有“mov seg,immediate”指令。
尽管程序员在当时经常抱怨 8088/8086,但它比我当时或之后看到的任何其他 16 位处理器都要好得多(注意:我认为 68000 是 32 位处理器)。
64?当然?阅读例如维基百科。乘以 64 就像左移 6 位(维基百科说它应该是 4,即 *16),即就像说选择器代表 22 位地址的最高有效 16 位(维基百科报告 20)。这也是维基百科中描述的真实模式(比我能做的更好)。
我不知道为什么选择器乘以 64?
一个 16 位指针可以轻松寻址 64 KB。
CPU 设计者希望能够处理 1 MB。
因此,他们没有使用单个 16 位指针,而是指定一个指针将由两个寄存器实现,即段加偏移量,其中“段”是一个 16 位寄存器,其值乘以 16 以寻址1 MB。
值 (16) 来自于将所需地址范围 (1 MB) 除以 16 位寄存器大小 (64 KB) 的自然可寻址性...即 16 来自 1 MB / 64 KB。