在8086的实模式下,把某一段寄存器左移4位,然后与地址ADDR相加后被直接送到
内存总线上,这个相加后的地址就是内存单元的物理地址
8086处理器的寻址目标是1M大的内存空间,于是它的地址总线扩展到了20位。但是,
一个问题摆在了Intel设计人员面前,虽然地址总线宽度是20位的,但是CPU中“算术
逻辑运算单元(ALU)”的宽度,即数据总线却只有16位,也就是可直接加以运算的指
针长度是16位的。如何填补这个空隙呢?
为了支持分段,Intel在8086 CPU中设置了四个段寄存器:CS、DS、SS和ES,分别用
于可执行代码段、数据段、堆栈段及其他段。每个段寄存器都是16位的,对应于地址总线
中的高16位。每条“访内”指令中的内部地址也都是16位的,但是在送上地址总线之前,
CPU内部自动地把它与某个段寄存器中的内容相加。因为段寄存器中的内容对应于20位地
址总线中的高16位(也就是把段寄存器左移4位),所以相加时实际上是内存总线中的高
12位与段寄存器中的16位相加,而低4位保留不变,这样就形成一个20位的实际地址,
也就实现了从16位内存地址到20位实际地址的转换,或者叫“映射”。
这里涉及了8086的分段机制,上面第一段话说是:“某一段寄存器左移4位”,这里“左移4位”不是很明白,好像在上面第三段话里给出了解释:“因为段寄存器中的内容对应于20位地
址总线中的高16位(也就是把段寄存器左移4位),所以相加时实际上是内存总线中的高
12位与段寄存器中的16位相加,而低4位保留不变,”但是我觉得还是糊里糊涂,请简老大指点一下……
左移4位是指二进制下左移4位,相当于十六进制下左移一位,也就是乘以10H,打个比方就明白了。
DS=(2000H),BX=(1000H),所以段地址就是2000H,段内偏移就是1000H
2000H左移4位(二进制下),就是20000H,加上段内偏移1000H,结果是21000H。
公式:
物理地址=段地址*10H(左移4位)+段内偏移
-------------------------------------------
综上所述,疑问如下:
x:段地址
y:偏移地址
D54AE:物理地址
公式:x<<4 + y = D5AE
有两组解的可能:(x1,y1),(x2,y2)
请问这样如何保证物理地址的唯一性?不同段地址、偏移地址可能是同一物理地址的冲突?
路过请解答,非常感谢!
阅读(2431) | 评论(2) | 转发(0) |