8086/8088 CPU的段寻址方式,段地址和偏移地址
例子
段地址 : 偏移地址 = 0000 : 0020H,0000×16+0020=00020H
段地址 : 偏移地址 = 0001 : 0010H,0001×16+0010=00020H
段地址 : 偏移地址 = 0002 : 0000H,0002×16+0000=00020H
这三组逻辑地址,虽然几个段地址和偏移地址不同,但表示的物理地址都相同,指向同一个字节单元。
也就是说,段寻址只是个表示方式,每个段的长度不固定,两个段可以重叠,一个物理地址可以用多个段地址+偏移地址表示。
你可以乘飞机到北京,然后乘汽车到西安;也可以乘飞机到徐州,然后乘汽车到西安,只不过要多坐很久;更可以直接到。
正文
8086/8088 CPU有20根地址总线,可直接寻址2^20=1M个字节的内存空间,寻址范围为00000~FFFFFH(H表示十六进制)。每个字节单元都有一个绝对的20位的物理地址。
但是CPU内部都是16位寄存器,没有20位的,就要把20位的物理地址转为两个寄存器表示的逻辑地址。
逻辑地址由段地址和偏移地址组成。类似“市民广场往北走100米”,用大地址+小地址表示,只不过现在小地址可以大得离谱。
段地址(或者叫段基地址)是在2^20个物理地址中找个显眼的的桩子,这个地址还能用16位寄存器表示。
因而选择物理地址低4位都是0的地址,即转为十进制是16的倍数的地址。只要默认规定在16位寄存器后补4个0就是物理地址,就可以用16位表示这个20位的段地址。
比如12340H(0001 0010 0011 0100 0000),可以记为1234H。
所以每隔16个地址就有一个段地址。
偏移地址(段内相对地址)是在段地址基础上,向后偏移的量,是正值。
虽然上面说,让2^20个物理地址中,每隔16个地址就有一个段地址,那么偏移量只需要在0~15内,但是多偏移点也没事啊,直接偏移到别的段里也没事!
因为放偏移地址的寄存器也有16位,所以最大可偏移2^16=64K个字节。
这样,如果想访问两个地址,可能就只需要一个放段基地址的寄存器。
所以每个的段地址都管得宽,段之间还能重叠。