上一篇讲了四个通用寄存器ax,bx,cx,dx,接下来介绍一下另外四个寄存器,指针寄存器和变址寄存器
sp(堆栈指针):这个寄存器与ss(后面说的寄存器中的)搭配使用,用于指向当前堆栈位置。
bp(基址指针寄存器):可用作ss的一个相对基址位置。
si(源变址寄存器):可用来存放相对于ds段之源变址指针。
di(目的变址寄存器):可用来存放相对于es段之目的变址指针。
这么说可能太难理解了:
接下来再看四个寄存器
ds(数据段寄存器),ss(堆栈段寄存器),cs(代码段寄存器),es(附加段寄存器):
为什么要将这8个寄存器合着说?
我曾经听龙哥说过,一个程序的运行的就是内存的不断变换,内存中的数据不断的存储,删除,赋值,更新。
所以当一个程序要运行时,就要知道这个程序运行的代码,所用的数据,以及可能要用到的堆栈。计算机不是人,没有人这么聪明,直接拿来用。计算机要使用这些数据必须将这些东西存储在一些地方,当需要时候,就找到这些地方,直接去取。就如我们要吃冰淇淋,就知道商店位置,然后给钱给老板,就可以拿到冰淇淋。计算就是这样,它要得到这些数据,就必须要得到这些数据的存储位置(也就是我们说的内存地址),然后,拿到该内存的数据,进行相应的操作。
下面是8086CUP给出物理地址的方法 :物理地址 = 段地址x16+偏移地址
看到这知道了ds,ss,cs,es的作用了,这四个寄存器原来是存储这段地址,这四个寄存器和ax,bx,dx,cx一样也是由16位二进制组成。用16进制表示的话就4位。例如0~1111,1111,1111,1111,变为16进制就是0~FFFF
因此段地址的最大值为FFFF。
偏移地址与段地址一样也是由16位的二进制组成,转化为16进制也是四位。
段地址:偏移地址 ------->1000:12BF------------>(物理地址)112BF
这就是一个内存单元的物理地址,在这个内存单元中存放着数据,计算机就根据物理地址访问到该要的数据如图:
下面我们看看我们我们的debug图:
由上面的图,很快就能知道我们当前所在的内存单元,同时我们也知道这一系列的字母代表着什么,如果大家打开的-r数据不一样的话,这是正常的,因为不同的计算机,我们所在的内存单元不同。同时,根据以上的提供的数据,我们就能算出物理地址,套用以上的公式.
知道以上的数据值代表的含义,我再讲讲es,bp,si,di:
首先你可能会想?
ES有什么用?计算机执行程序不是只用到三种段地址吗?还有就是bp,si,di有什么作用?
想想看?