(1)在8086CPU中,它是16bit结构,一次可以传送一个字的数据,但其地址总线有20根,一次可以传送2的20次方的数据
也就是说它的寻址能力为1MB,很明显,如果将地址从CPU内部简单的发出来,一次就只能传送16bit的地址,寻址能力
只有64KB了。
至于为什么这么设计,真心还不知道,但8086CPU采用了用两个地址相加的方法来解决 了这种消耗。
8086CPU提供一个16bit的段地址和一个16bit的偏移地址,利用一个地址加法器将两个地址合成一个20bit的地址
合成公式:
物理地址 = 段地址*16 + 偏移地址
如:2345C的物理地址,若其段地址为2345,其偏移地址就为C(这是根据16进制的加法算的,可以用熟悉的10进制加法
来理解16进制,10进制里乘以一个10就在其后加一个0,16进制里也是一样的,遇到16就往前进1,乘以16就在其后加0)
其中段地址和偏移地址是任意给出的,只要满足公式即可
(2)再想这么一件事,计算机中每一个字节放一个数,这些数有些是指令,有些又是数据,计算机在内存中获取这些数的时候,
是怎么区分这些数哪些是指令哪些是数据呢?8086CPU里,把这些东西分开放到了不同的地方,也就是指令与数据神马的
都会分开,这样就不会让计算机混淆了,不过,分开了又怎么去提取这些数据的地址单元呢?这个时候,8086CPU就提供
了四个段寄存器,用于存放各段内存的段地址,并提供了相应的方法来表示偏移地址,每个段寄存器存放不同的数据的地址,
这样就可以在计算机要提取指令的时候去一段内存里找,要提取数据内容的时候就跳到另一段内存里找,这里先看其中三种
段寄存器。
CS:
存放指令的段地址,其偏移地址用IP寄存器存放,表示方法:CS:IP,CS,IP都代表实在的数。
如:2000:10 就表示地址为20010的内存单元
CPU从何处开始执行指令由CS:IP决定,CPU只认为被CS:IP指向的内容单元中的内容为指令
改变CS:IP:jmp CS:IP即可从CS:IP指向的内存段中
的内容执行
DS:
存放数据的段地址,其偏移地址用[.]表示,没有用寄存器来存放,方括号里的.表示一个数字
看示例:
mov ax 2000
mov ds ax
mov ax [1]
ax的数据一开始为2000,将它送入ds中后,ds变成了2000,这个时候[1]执行时,CPU就会去ds寄存器中提取存放数据的
段地址,然后根据偏移量1来得到内存单元,将其中的数当作数据来处理,而不是指令
SS:
存放栈的段地址,其偏移地址用SP寄存器表示,表示方法:SS:SP
确定一个栈的栈底、栈顶、栈大小的示例:
mov ax 3000
mov ss ax
mov sp 0010
push ax
ax的数据为3000,将它送入ss中,再将0010送入sp,这个时候,将ax中数据push如栈中,CPU就会去ss中提取栈段地址,