汇编学习笔记----8086CPU的段寄存器

(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中提取栈段地址,
再去sp中提取偏移地址,得到其栈顶指针指向地址:30010,栈大小为16字节,push一个ax,栈顶指针往低地址给移动两个
字节,栈顶指针就变为3000E,当然,sp的最大偏移量为FFFF,由于CPU的设计,只能人工控制栈的越界处理。


注意:8086CPU是不允许将数据直接写入段寄存器中,只能通过内存单元([0][2]...)或寄存器来间接写入数据





你可能感兴趣的:(c,汇编)