寄存器和内存
1.寄存器
1.1cpu的组成
cpu由运算器、控制器、寄存器等器件依靠内部总线连接组成
内部实现实现cpu内部各个器件之间的联系
外部总线实现cpu和主板上其他器件的联系
cpu中器件和功能
器件 | 功能 |
---|---|
运算器 | 信息处理 |
寄存器 | 信息存储 |
控制总线 | 控制各种器件进行工作 |
内部总线 | 连接各种器件,在器件之间进行数据的传送 |
8086cpu中有14个寄存器
1.2通用寄存器
8086cpu的所有寄存器都是16位的(重点),因此可以存放两个字节。
AX,BX,CX,DX这4个寄存器被称为通用寄存器,用来存放一般性的数据。
逻辑结构如图所示
所以能存储的最大数据为
无符号16位整数的范围是从0到 216−1
有符号整数为2-15 到 215-1(第一位做符号位,所有只有15个数据位)
8086cpu的AX、BX、CX、DX也可以分为两个独立的8位寄存器来用
AX可分为AH、AL
BX可分为BH、BL
CX可分为CH、CL
DX可分为DH、DL
低8位(0 - 7位)构成了AL寄存器,高8位(8 - 15位)构成了AH寄存器
AH和AL都是可以独立使用的(如下图)
2.字在寄存器中的存储
字节:记为byte,由8个bit构成,可以存在8位寄存器中。
字:记为word,一个字由两个字节组成,这两个字节分别称为这个字的高位字节和低位字节。
高位字节在高8位寄存器中
地位字节在低8位寄存器中
3.汇编指令
注意:
1.汇编指令不区分大小写。
2.高8位和低8位分别运算都可以进行独立运算,运算结果只保留高(低)8位置。
3.运算也会存在溢出问题超出16位的运算结果溢出超过16位的部分。
4.指令的两个操作对象的位数应当是一致的。
4.物理地址
4.1物理地址的概念
概念:所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,这个唯一的地址称为物理地址。
4.2 16位结构的cpu
特性:
4.3物理地址在8086cpu中的表示
由于8086cpu是16位结构,所有能处理的地址信息只能达到16位,但是实际上8086cpu有20根地址总线,可以传输20位地址,所以用两个16位地址合成的方法来形成一个20位的物理地址。
因此
物理地址 = 段地址*16 + 偏移地址
段地址*16可以看作是基础地址
4.4段的概念
内存是连续的,并没有分段,只是在编程需要时,可以把若干地址连续的内存单元看成是一个段。
注:
1.段地址必然是16的倍数,因为段地址开始会*16
2.偏移地址为16位,所以16位的寻址能力为64KB,所以一个段的长度最大为64KB
关于物理地址的描述
如"数据在21F60H内存单元中"
有两种描述方法
1.段地址:偏移地址 如:2000:1F60
2.数据存在内存的2000H段中的1F60H的单元中。
5.CS和IP
CS和IP是8086cpu中两个最关键的寄存器
CS为代码段寄存器
IP为指令指针寄存器
具体作用如:
设CS中的内容为M,IP中的内容为N,8086cpu将从内存M * 16 + N的单元开始,读取一条指令并且执行。
格式也可以为段地址表示法 CS:N
CS和IP修改方法:不能直接使用mov指令修改CS,IP的值,因为8086cpu设计时没有提供这样的功能
两种方法修改
1.使用jmp指令
jmp 段地址:偏移地址 这种方法会同时修改CS和IP
jmp 某一合法的寄存器 这种方法只会修改IP的值
2.使用mov指令先赋值给中间寄存器
mov ax,1000H
mov cs(ip),ax
这样即可实现间接的修改cs(ip)的值
6.指令的读取执行原理
例
因此8086的工作过程可以简要描述如下:
由执行过程可知:
1.读取一条指令后,IP中的值自动增加,以使cpu可以读取下一条指令
2.之前读入的指令长度为多少,IP中的值加多少。
3.内存中一段信息被cpu执行过的话,那么他所在的内存单元必然被CS:IP指向过。
7.段寄存器
7.1代码段寄存器
段寄存器也就是CS:IP ,CS存的是段地址,IP存的是偏移地址,cpu只会认为CS:IP所指的内存单元中的内容为指令
8086cpu的工作过程
1.从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲区。
2.IP指向下一条指令。
3.执行指令(转到步骤1,重复这个过程)。
7.2数据段寄存器
7.2.1内存中字的存储
cpu中,用16位的寄存器存储一个字,一个字为两个字节,将数据的高8位放在高字节,低8位放在低字节。
例如
存储4E20H和0012H
由此产生字单元的概念
字单元:存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。
我们常称起始地址为N的字单元简称为N地址单元,比如一个字单元由1,2两个内存单元组成,我们就说是1地址字单元。
7.2.2数据段寄存器的使用
前面我们说过cpu将CS:IP所指的内容认为是指令,那么肯定也有一个东西将内存单元中的东西看成是数据这个东西就是数据段寄存器。
数据段寄存器DS常常和偏移地址一起使用
[偏移地址]就代表内存地址为DS:偏移地址 这样的一个内存地址
例如:
mov ax,[0]
代表将内存地址为DS:0的数据赋值给ax。
注意数据段寄存器的使用的时候赋值
一定是同字节数赋值
1.
mov ax,[0]
因为运算要保证是同字节运算,所以ax为两个字节数据,那么赋值数据段寄存器也是两个字节数据,即把ds:0,ds:1的数据赋给ax。
假设ds:0数据为01H,ds:1的数据为12H,那么ax结果就为1201H.
mov al,[0]
那么只会将ds:0的内存单元数据赋值给al。
7.3栈段寄存器
顾名思义就是像内存单元像栈一样访问
我们使用SS,SP来标记一段内存单元是栈空间
SS:段地址
SP:偏移地址寄存器
两种操作
push和pop
push执行过程
pop执行过程
注意:
内存单元作为栈空间只是我们认为设定的,是会存在栈顶超界问题的。