16位实模式下的物理地址公式?

时间:2010-06-23 20:58:31

标签: assembly

物理地址= 16 *选择器+偏移量 但我不知道为什么选择乘以16?

4 个答案:

答案 0 :(得分:4)

为了与Z80“兼容程序员”,但仍然能够使用超过64 kiB的内存,早期的英特尔处理器引入了内存分段。在添加到16位偏移之前,16位段将向左移位4位(意味着乘以16, 64,如您的问题所述),从而产生20位地址。

对于习惯使用Z80的程序员来说,所需要的只是使用操作系统提供的段,他们可以使用给定的64千字节偏移量。新的程序员可以对段进行更复杂的操作,允许他们访问1 MiB的地址空间(IBM PC将其降低到640 kiB,但出于他们自己的原因)。

答案 1 :(得分:2)

64?当然?阅读例如wikipedia。乘以64就像向左移6位(维基百科说它应该是4,即* 16),即就像说选择器代表22位地址的最重要的16位(维基百科报告20)。这也是维基百科中所描述的真实模式(比我能做的更好)。

答案 2 :(得分:2)

8088/8086的目标是提供一种方法,使16位处理器可以拥有1兆字节的寻址空间,而无需程序员将地址空间划分为64K块,并担心地址是否越过边界它们之间。虽然它受到了很多诽谤,但实际上它比我用过的处理超​​过寄存器大小的地址的其他方法更好。在数据被自然细分为64K或更少的项目的情况下,以及在16字节边界上开始填充项目是可接受的情况下,它通常相对容易地工作。乘以16(而不是一些更大或更小的数字)可能是任意的,但是当以十六进制表示法列出事物时它很方便,并且在使用两个小数字之间是一个很好的折衷(这将限制地址空间到半个或更少的数字)或者数字太大(这需要更多的代码来处理分配的块的任意偏移,否则会浪费更多的内存填充块到更大的数量)。

8088分割设计中唯一的主要缺陷是:

  1. 两个通用分段寄存器“不够”。常见的模式是“将数据从一个对象复制到另一个对象,使用第三个对象进行翻译”;只有当其中一个对象存在于代码段或堆栈中时,才能有效地实现该模式。不幸的是,直到80386才解决这个问题,通常的做法是忽略细分市场。
  2. 没有任何好的方法可以对段寄存器进行任何算术运算。从DS或ES(或FS或GS)添加或减去0x1000的指令,无论是否设置了进位 - 总共8个(或16个)操作码 - 将极大地方便了段处理。
  3. 应该有“mov seg,immediate”指令。

尽管程序员经常在当天抱怨8088/8086,但它比我当时或之后看到的任何其他16位处理器要好得多(nb:我认为68000是一个32位处理器)。

答案 3 :(得分:1)

  

我不知道为什么用选择器乘以64?

16位指针可轻松寻址64 KB。

CPU设计人员希望能够处理1 MB。

因此,他们没有使用单个16位指针,而是指定一个指针由两个寄存器实现,即段加偏移,其中'segment'是一个16位寄存器,其值乘以16 in为了解决1 MB的问题。

值(16)来自于将所需的地址范围(1 MB)除以16位寄存器大小(64 KB)的自然可寻址性...即16来自1 MB / 64 KB。