在8086微处理器中找到物理地址

时间:2012-09-15 16:45:44

标签: microprocessors

在8086微处理器中,一个20位地址被分成16位+ 4位地址,其中4位二进制是段地址。当我们将4位二进制转换为十六进制时,它得到1位十六进制。我的问题是当我们遇到问题时从逻辑计算物理地址,给出一个4位十六进制段地址。为什么会这样? 同样在物理地址的计算中,我们在lsb中追加0以找到段的基地址,然后我们将偏移量添加到其中。追加0背后的逻辑是什么?

2 个答案:

答案 0 :(得分:3)

一段相当于一段。一个段落等于16个十进制字节或10个十六进制字节。因此,具有零偏移的89AB的段值等于89AB x 1089AB0注意:此上下文的所有地址均为十六进制)。

对于段偏移到20位绝对地址转换示例,最好如下所示:

89AB:F012  ->  89AB   ->  89AB0   (paragraph to byte ->  89AB x 10 = 89AB0)
                F012  ->  0F012   (offset is already in byte unit)
                          ----- +
                          98AC2   (the absolute address)

对于段偏移转换的绝对地址:

98AC2  ->  9 8AC2  ->  9     ->  9000  ->  9000:8AC2
           (split)     8AC2      8AC2

...或

98AC2  ->  98AC 2  ->  98AC  ->  98AC  ->  98AC:0002
           (split)        2      0002

或者可以在中间分开......

98AC2  ->  98 AC2  ->  98    ->  9800  ->  9800:0AC2
           (split)      AC2      0AC2

以上三个段偏移地址(包括89AB:F012(原始地址值)都指向相同的绝对地址(相同的物理位置)。

答案 1 :(得分:0)

任何被认为是段寄存器的寄存器中的值乘以16(或向左移一个十六进制字节;在十六进制数的末尾添加一个额外的0)然后添加一个偏移寄存器中的值它。因此,使用以下公式可以找到段和偏移对的任意组合的绝对地址: 绝对
内存
位置

=(段值* 16)+偏移值

在完成一些示例之后,这将变得更加清楚:分段:偏移对,F000:FFFD的绝对或线性地址可以在您的脑海中轻松计算,只需在末尾插入一个零即可。段值(与乘以16相同)然后添加偏移值:             F0000            + FFFD            ------             FFFFD或1,048,573(十进制)

这是另一个例子:923F:E2FF - >

        923F0
       + E2FF
       ------
        A06EF   or   657,135(decimal)

现在让我们计算可以使用Segment:Offset reference表示的最大值的Absolute Memory位置:             FFFF0           + FFFF
          -------            10FFEF或1,114,095(十进制) 实际上,直到8086之后的某个时间,这么大的值实际上与真实的Memory位置相对应。一旦PC变得普遍拥有超过1MiB的内存,程序员就会开发出利用它的方法,而最后一个字节成为现在所谓的HMA(高内存区域)的一部分。但在此之前,如果程序试图使用超过20位绝对地址(1MiB)的Segment:Offset对,CPU将截断最高位(8086/8088 CPU只有20个地址线),有效映射FFFFFh(1,048,575)上的任何值到第一个段内的地址。因此,10FFEFh被映射到FFEFh。

使用Segment的一个缺点:Offset对(可能会让大多数人感到困惑)是大量这些对引用相同的内存位置。例如,下面的每个Segment:Offset对都指的是内存中完全相同的位置: