标题:
实模式寻址方式
[打印本页]
作者:
yuyang911220
时间:
2016-10-19 20:41
标题:
实模式寻址方式
逻辑地址
:即逻辑上的地址,实模式下由“段基地址
+
段内偏移”组成;保护模式下由“段选择符
+
段内偏移”组成。
线性地址
:逻辑地址经分段机制后就成线性地址,它是平坦的;如果不启用分页,那么此线性地址即物理地址。
物理地址
:线性地址经分页转换后就成了物理地址。
实模式寻址方式
刚才说了
8086CPU
数据总线为
16
位,也就是一次最多能取
2^16
=
64KB
数据,这个数据也解释了实模式下为什么每个段最大只有
64KB
。但刚才还说了其地址总线为
20
位,这样它能寻址的能力其实是
2^20=1MB
,这也就是实模式下
CPU
的最大寻址能力。既然它有
1MB
寻址能力,那怎么用
16
位的段寄存器表示呢?
这就引出了分段的概念,
8086CPU
将
1MB
存储空间分成许多逻辑段,每个段最大限长为
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