为什么8086的逻辑地址转换成物理地址需要 段基址左移四位+段内偏移量

2025-01-02 07:56:39
推荐回答(5个)
回答1:

8086的内存访问空间是可以达到1MByte的,但我们知道8086是16位字长机器,如果用16位寄存器来表示地址空间的话,最大只能访问到2^16=64KByte的物理空间,也就是说每一字节地址是从0000H-FFFFH排列的,那么2^20=1MByte的内存空间地址就要从00000H-FFFFFH进行编址,也就是说每一个字节地址都有一个唯一的20位的地址编码(物理地址),而8086机器中16位字长没办法装下这20位地址。
怎么办呢?就用2个16位来表示了,其中一个16位表示段地址,另一个表示段内偏移地址。这样一来,按理说,16位+16位=32位了,也就是说可以访问到2^32=4G的物理空间了。但是8086对段地址编码有限制,不能对64K字节的存储区作为一个大段来分配给它一个段地址,而是一个段地址只能有16个字节这样一个小的存储区,或者说16个字节存储空间就占用一个段地址,这样子一来,2^16个段地址×16字节/段=2^20字节地址了,每一16字节小段的起始地址就是段地址,因此,可以用“段地址×16+偏移地址”就可以访问2^20字节内的任意字节地址了,而“段地址×16”所表示的意思就是“段地址左移四位”,因此就是“段基址左移四位+段内偏移量”来转成物理地址这样了。
需要说明的是,段内偏移量也是用一个16位地址来表示的,不仅限于小段内的16个字节,除非段地址已处于最后的小于64K字节的区域。

回答2:

你是觉得如果这样转换的话会溢出是吧

维基百科有一段是这样说的

086有4个存储器区段(segment)暂存器,可以通过索引暂存器来设置。区段暂存器可以让CPU一种当时是全新的方式访问多达1MB之存储器。在现今有区段的处理器中,8086把区段暂存器左移4位然后把它加上去寻址。这通常被认为是一个不太好的设计,因为这么做会让各区段有重叠。

8086的分段寻址,是指一个物理地址由段地址(segment selector)与偏移量(offset)两部分组成, 长度各是16比特。其中段地址左移4位(即乘以16)与偏移量相加即为物理地址。例如,06EFh:1234h,表示段地址为06EFh, 偏移量为1234h, 物理地址为06EF0h + 1234h = 08124h。在计算物理地址时如果发生上溢出,8086处理器舍弃进位。例如,FFFFh:0010h所对应的物理地址为00000h.
一个20位的物理地址对应着4096个不同的"段地址:偏移量"的组合。这是因为,偏移量的最低4位对应于物理地址的最低四位,而偏移量的高12位共有4096个取值。

回答3:

我是这样理解的:
8086地址总线为20根,可以传送20位地址,寻址能力:2^20=1MB
数据总线为16位,寻址能力:2^16=64MB
所以,利用地址加法器,将2个16位地址合成1个20位的物理地址
物理地址=段地址*16+偏移地址
段地址:范围0000h-FFFFh,最大值FFFFh换算成10进制为65535,即2^16.
段地址*16 最大值:2^16*16=2^16*2^4=2^20=1MB
此时,最大值,即达到地址总线所表达的最大寻址能力。
==========================================
【回归到小学数学角度】表示238这个数,你可以写成238=2*100+3*10+8
将2乘以100,这个100表示2在百位。
你可以想成:用2,3,8这三个数字,怎么表示238这个三位数。

回答4:

因为那些牛逼的工程师就是这么设计的。
这是一个设计决定,他们就是把 逻辑地址 到 物理地址 这样设计的;他们可以设计成别的样子,但现在 8086 已经出产了。

要知道,16 位的地址 只能用 64KiB 的内存,而 左移四位 后可以产生 1MiB 的物理地址,这在当时是很大的了。

至于溢出,后来的 80286 有 21 位的 物理地址 ,而且后来的 PC 里有一个 A20 线 是用来控制用不用加出来的那一位。

回答5:

地址是20位的,要是不左移的话,16位加16位最多就是17位数,怎么访问1M的内存?这问题真没意思,至于溢出的事情更不可能,因为地址运算用的是单独的20位的加法器,不是ALU。。。不过也有书上说它用的就是20位的ALU,这个问题我的看法是不可能,因为地址运算要很多时钟周期,所以不可能和操作数共用一个ALU