注册 登录
编程论坛 汇编论坛

汇编8086合成20位地址的问题

asd451006071 发布于 2010-11-13 23:28, 977 次点击
王爽的汇编语言中,说过:“用段地址<<4 &偏移地址”,我有一点不明白的是内部实现原理:
(1),我以前看视频(具体的不记得)说:段基址什么的XXXXh 低两位不用什么的?就是说是不是段地址和偏移地址的4个位都用上,在段地址*4+编译地址,还是约定段地址和偏移地址有一些部分(数位)不用?
(2).如果段地址和偏移地址的数位都用上,那么合成的时候不会出现问题吗?
3 回复
#2
czsbc2010-11-14 16:55
段地址*16+偏移地址
如:2345H:6789H的物理地址为29BD9H
即2345H*10H+6789H
#3
xiaomarn2010-11-15 17:24
8086的地址总线是20 位,可以传送20位地址,达到1mb的寻址能力,而8086cpu又是16位结构....只能传送16位的地址,寻址能力只有64kb.....(汇编语言-王爽)
为了达到寻址1mb的能力(20位地址线),就采用分段的模式,用两个寄存器表示一个地址,将1mb除以64kb刚好是16,也就是说我们只要十六个 64kb(也就是16位寄存器)就行了,也就是说只要拿另外一个寄存器记录十六个段就行了,但我们都知道段寄存器都是16位的(64kb),如果每个数字 都表示一个段,然后首尾相接再加到一起,算下,就是64k*64k,恩,太大了,远远超出我们的1mb了(我也知道越大越好,但谁叫我们的地址线只有二十 位),办法就是段覆盖,想想扑克牌,我们要用几张牌形成一个两米的长龙,也许只要十六张牌(段)就行了,但现在我们牌多(有一副),还是要完成同样任务, 就把他们相互重叠着展开(相当段覆盖)。。。
覆盖倒是可以,但是不能盖到一起啊(就像一副牌全缩到一起,长度也就一张牌长),所以相邻两个段至少也得相隔16字节,(16*64KB(段)=1mb),也就是为什么段起始要是十六的倍数
#4
p8x8x82010-11-19 21:19
其实只要你把段寄存器赋值了 再给出一个偏移地址 就可以达到内存线段的某一点 也就是说8086机制的0000H:0000H 的地址就是00000H
而段址的高四位是从你赋值开始 直到你再次赋值前是不变的。
1