in 8086 microprocessor a 20 bit address is divided in 16bit+4bit address in which 4 bit binary is the segment address.when we convert a 4bit binary into hexadecimal it gets to 1bit hexadecimal.my question is when we encounter the problem of calculating the physical address from the logical, a 4bit hexadecimal segment address is given.why is it so? Also in the calculation of physical address we append 0 in lsb to find the base address of the segment and then we add the offset into it. what is the logic behind appending 0?
2 回答
一段等于一段。一个段落等于 16 个十进制字节或 10 个十六进制字节。因此,偏移量为零的段值89AB
等于89AB x 10
或89AB0
(注意:对于此上下文,所有地址都是十六进制的)。
对于段偏移到 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
(原始地址值)都指向同一个绝对地址(同一个物理位置)。
任何被认为是段寄存器的寄存器中的值乘以 16(或向左移动一个十六进制字节;在十六进制数的末尾添加一个额外的 0),然后将偏移寄存器中的值添加到它。因此,可以使用以下公式找到 Segment 和 Offset 对的任意组合的绝对地址:绝对
内存
位置
=(段值 * 16)+ 偏移值
通过一些示例之后,这将变得更加清晰易懂: Segment:Offset 对的绝对或线性地址,F000:FFFD 可以通过简单地在 Segment 值的末尾插入一个零在您的脑海中很容易地计算出来(这与乘以 16 相同)然后添加偏移值:F0000 + FFFD ------ FFFFD 或 1,048,573(十进制)
这是另一个例子: 923F:E2FF ->
923F0
+ E2FF
------
A06EF or 657,135(decimal)
现在让我们计算可以使用 Segment:Offset 引用表示的最大值的绝对内存位置:FFFF0 + FFFF
------- 10FFEF 或 1,114,095(十进制) 实际上,直到 8086 之后的一段时间,如此大的值才真正对应于实际的内存位置。一旦 PC 拥有超过 1MiB 的内存变得很普遍,程序员就开发了利用它的方法来发挥自己的优势,最后一个字节成为现在称为 HMA(高内存区)的一部分。但是直到那个时候,如果程序尝试使用超过 20 位绝对地址 (1MiB) 的 Segment:Offset 对,CPU 会截断最高位(8086/8088 CPU 只有 20 条地址线),有效地映射任何超过 FFFFFh (1,048,575) 的值到第一个段内的地址。因此,10FFEFh 被映射到 FFEFh。
使用 Segment:Offset 对的缺点之一(可能会让你们大多数人感到困惑)是大量这些对引用相同的确切内存位置这一事实。例如,下面的每个 Segment:Offset 对都指代内存中完全相同的位置: