上节提到了段地址的概念,实质上,内存并没有分段,而是从CPU的角度把内存按段来看待和操作。
段地址的值x16就是物理地址的初始地址·,偏移地址代表段中的内存单元。
将若干地址连续的内存单元看做一个段,用段地址x16定位段的起始地址,用偏移地址定位段中的内存单元。
有两点需要注意:
1.段的起始地址一定是16的倍数,这是肯定的。
2.偏移地址位16位,16位的寻址能力是64KB,所以一个段的长度最大是64KB,也就是16位。
8086提供了四个段寄存器:CS、DS、SS、FS。8086CPU要访问内存时,由这四个段寄存器提供内存单元的段地址。
设CS中的内容为M,IP中的内容为N,8086将从内存Mx16+N的位置开始读取指令并执行。
也可以说:8086机任意时候,CPU将CS:IP指向的内存地址当做指令执行。
一般段寄存器是与IP指令指针寄存器共同使用,每执行一步操作,IP值自动+指令长度,从而指向下一条指令。
一般来讲8086CPU的工作过程可以概括如下:
- 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器
- IP=IP+所读取的指令的长度,指向下一条指令
- 执行指令,转到第一步,重复这个过程
在内存中,指令和数据都是二进制信息,在第一节中展示了一段机器码,以及与之相等的汇编语言的指令,很惊讶的发现,汇编语言的指令在机器语言看来仍然只是一段二进制数而已。
那么为什么CPU会将CS:IP指向的内存单元中的内容看做指令而不是数据呢?
答案是:CS:IP会被地址加法器处理得到20位的物理地址,CPU拿到这个物理地址会到内存中读取指令。
另外,如果内存中的一段信息被CPU执行过的话,那么它所在的单元一定被段地址与指令地址组合得到的物理地址指向过。
由此可见,CS:IP决定了CPU的寻址方式。