8086/8088寻址为1M的由来
一.8086/8088的寄存器是16位的,例如AX,BX,SI,DI都是16位的,它们能表示的地址码所以只有16位的。2的16次方等于64K,这是我们作为程序编写者能通过寄存器直接访问的内存空间。而8086/8088CPU提供的地址总线有20位,2的20次方等于1M,这是CPU它自己能访问的最大内存空间。
这就有个矛盾了:CPU能访问1M内存,而寄存器却只能表示64K内存大小。所以就引入段地址和偏移地址的概念。把这1M 的内存空间分成64K大小的一段段,指定哪一段,然后再在这个段的开始加上“偏移地址”,这不就可以访问1M内存的任意空间了?
段地址怎么得到的问题:
比如在汇编数据段某处声明了某个字符变量 STR
MOV DX,SEG STR
通过SEG 语句则可把STR所在段地址取出来,送给DX.
二.8086CPU地址总线有20根,能寻址1MB的存储单元。
8086CPU通过16条数据总线、20条地址总线和若干条控制总线与外部进行数据交换。由于地址总线有20条,所以CPU可以访问的存储单元数为2的20次方,即1M个存储单元。每个存储单元存放8位二进制数,即一个字节,且这些存储单元都是顺序排列的,每个单元用唯一的一个物理地址标示,这个物理地址既是由地址总线得到的20位二进制数。
关于寻址范围这里强调一下,N位地址线能访问2的N方个存储单元。比如:1位地址线只能访问2个存储单元,两位地址线能访问4个存储单元,等等。
至于每个存储单元的大小要看CPU的字长了,即CPU的数据总线。8086的字长为16位,它的数据总线为16位,本应该存储单元是16位的,但为了与8位机兼容,将这16位分成了高8位和低8位,在寻址时用19位地址线确定16位的存储单元,用另一根地址线决定是高8位还是低8位。