为什么基地址和偏移地址都是iAPX 86架构中的16位常量?

时间:2017-03-21 23:49:38

标签: assembly x86 nasm reverse-engineering x86-16

我正在阅读8086处理器的内存组织和地址功能。

到目前为止,我已经了解到8086处理器通过其20位地址总线可以处理1MB不同的物理内存位置。整个存储器位置被分割成16个块,每个段大小为64KB。因此,为了访问段内存储器位置的内容,我们需要提供其16位二进制值(也称为偏移地址),这在我们需要时完全有意义正好16位代表所有64千字节的内存。

我不明白为什么基地址必须是16位值?

根据我的理解我们只需要4个位(基数)来表示所有16个段(即0000,0001,0010,1211,0100,0101,0110,0111,1000,1001,11010,1011,1100,1101 ,1110,1111)我们需要额外的16位(偏移量)来表示这些段内的字节((2 ^ 16)*(2 ^ 4))= 2 ^ 20.

以下是解释偏移量和基地址的教科书中的示例

1000:1F00 =(1000 * 10h)+ 1F00 = 11F00; 16位基数和偏移量

1 个答案:

答案 0 :(得分:0)

我需要看到这些教科书,重要的是你的地址是段时间0x10加上偏移/地址(地址=(段<<<<<<<<<<<<<> +偏移))。因此,就我而言,一个段的大小是16个字节,有65536个段,每个段中可以有65536个字节,并且存在大量重叠。

重要的是向后工作,我有一个需要生成的20位地址,我有一个段寄存器和一个偏移量。有12位重叠,因此有4096种不同的方式来建立该地址。选一个。理想情况下,您希望选择一个减少必须更改段的次数,或者以另一种方式说明最大化同一段的重用次数。

修改

我忘记了段落一词。假设您的偏移始终为零,并且您增加了段,这将在对齐的16字节边界上。那些是段落。段是您可以在不更改段寄存器的情况下访问的65536字节,因此存在65536个具有大量重叠的段(每个可能的段寄存器值一个)。

如果你在一些结构/数组中说了16K字节的数据/你想用一些代码块来访问它们,你会想要使用一个段偏移组合,这样你就不必改变段而是一次环绕16K和使用偏移量线性或随机地漫游。效率较低的方法是使用段偏移组合来遍历或随机浏览更改段寄存器所需的16K字节数据。