Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3432716
  • 博文数量: 754
  • 博客积分: 10132
  • 博客等级: 上将
  • 技术积分: 7780
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-14 23:36
文章分类

全部博文(754)

文章存档

2012年(3)

2011年(39)

2010年(66)

2009年(167)

2008年(479)

我的朋友

分类:

2008-02-14 22:23:50

在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)
请问这样如何保证物理地址的唯一性?不同段地址、偏移地址可能是同一物理地址的冲突?
 
路过请解答,非常感谢!
阅读(2446) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

piaomiaoju2011-03-28 22:53:27

所以相加时实际上是内存总线中的高 12位与段寄存器中的16位相加,而低4位保留不变,”但是我觉得还是糊里糊涂,请简老大指点一下…… ===================== 因为段寄存器左移了4位,所以低4位为零,所以内存总线的低4位保持不变。 公式:x<<4 + y = D5AE 有两组解的可能:(x1,y1),(x2,y2) 请问这样如何保证物理地址的唯一性?不同段地址、偏移地址可能是同一物理地址的冲突? ============== 不仅仅是两组解,应该说同一物理地址有多种逻辑表达方式。8086本身要求一定的对齐方式,加上实地址模式操作系统的设计策略,才导致不冲突的吧。 我也是初学者,看到好奇,希望下面继续。

yuqilin12282009-05-13 19:06:31

推荐一本书:王爽《汇编语言》,应该能找到你要的答案 呵呵