Board logo

标题: 实模式寻址方式 [打印本页]

作者: yuyang911220    时间: 2016-10-19 20:41     标题: 实模式寻址方式

逻辑地址:即逻辑上的地址,实模式下由“段基地址+段内偏移”组成;保护模式下由“段选择符+段内偏移”组成。

线性地址:逻辑地址经分段机制后就成线性地址,它是平坦的;如果不启用分页,那么此线性地址即物理地址。

物理地址:线性地址经分页转换后就成了物理地址。

实模式寻址方式

    刚才说了8086CPU数据总线为16位,也就是一次最多能取2^1664KB数据,这个数据也解释了实模式下为什么每个段最大只有64KB。但刚才还说了其地址总线为20位,这样它能寻址的能力其实是2^20=1MB,这也就是实模式下CPU的最大寻址能力。既然它有1MB寻址能力,那怎么用16位的段寄存器表示呢?


    这就引出了分段的概念,8086CPU1MB存储空间分成许多逻辑段,每个段最大限长为64KB(但不一定就是64KB)。这样每个存储单元就可以用“段基地址+段内偏移地址”表示。段基地址由16位段寄存器值左移4位表达,段内偏移表示相对于某个段起始位置的偏移量。比如:

SEG=0x07c0

jmpi offset, #SEG

offset: mov ax,cs


实模式下的寻址举例:
先找到CS代码段的地址
mov ax,cs
然后把段地址乘以16,即将16位变成20位。这时因为8086的数据总线是16位的,但是地址总线是20位的。实现方法很简单,左移4位即可。
shl eax, 4
然后根据你要寻址到的子代码,加上其对应的偏移地址:
add eax, LABEL_SEG_CODE32

这样便得到了所寻位置的物理地址。
因为地址总线只有20位,所以最大寻址空间只有1M。

8086中含有存储器.存储器中每一个单元的地址可以用两种方法表示:
1.逻辑地址:其表达形式为“段地址:段内偏移地址”.
2.物理地址:CPU与存储器进行数据交换时在地址总线上提供的20位地址信息称为物理地址.
物理地址=段地址×10H+段内偏移量
CPU一次处理的数据是16位,地址总线实际上代表CPU的寻址能力,地址线为20条那么CPU实际的寻址能力就是2的20次方就是1M.实际的物理地址是这样形成的:段地址*10H+偏移地址,偏移地址用IP指向,IP是16位的.
例如段地址是1234H,偏移地址是4321H
那么实际的物理地址怎么算呢:1234H*10H+4321H=12340H+4321H=16661H
实际上可以这么来理解,就是段地址左移一位后加上偏移地址就得出实际的物理地址.
再比如:逻辑地址:1500H先化为2进制 0001 0101 0000 0000
左移四位就是0001 0401 0000 0000 0000,即15000H
若偏移地址为1000H 则物理地址就是16000H




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0