答案 0 :(得分:3)
一段相当于一段。一个段落等于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
(原始地址值)都指向相同的绝对地址(相同的物理位置)。
答案 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对都指的是内存中完全相同的位置: