寄存器01

1.cpu的基本结构
cup的结构:
    1】运算器    ->信息处理;
    2】寄存器    ->信息储存;
    3】控制器    ->控制各类器件工做;
    4】内部总线    ->链接cup内部各器件;
汇编程序主要和寄存器打交道;
寄存器是cpu中程序员能够用指令读写的部件;能够经过改变寄存器中的内容来实现对cpu的控制;
不一样的cpu中寄存器的个数、结构不一样;
例如:8086cpu中的寄存器有:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW;
 
2.通用寄存器
在8086cpu中,寄存器都是16位的;
AX、BX、CX、DX这4个寄存器用来存放通常性的数据,被称为通用寄存器;
为了兼容旧的8位cpu程序,能够将寄存器分红两个独立的8位寄存器来使用;
例如:AX能够分为:
    AH    ->寄存器AX的高8位
    AL    ->寄存器AX的低8位
 
3.寄存器中的储存
为了保证兼容性,8086cpu能够处理两种尺寸的数据;
    字节byte    ->一个字节有8bit,能够保存在8位寄存器中;
    字word    ->一个字有两个字节16bit,这两个字节分别称为这个字的高位字节和低位字节;
 
4.简单的汇编指令
mov    ->用来赋值
例如:下面的语句表示将18送入寄存器ax;
mov ax,18
 
add    ->加运算
例如:将ax和bx的值相加,并将结果保存在寄存器ax中
add ax,bx
 
指令空格后面第一个表示存放值的寄存器,第二个表示运算的值;
汇编指令和寄存器名不分大小写;MOV AX,8 等价于 mov ax,8;
 
注意事项:
   1】 例如: 寄存器al的值为c5H;
    执行指令 add al 93H;
    计算的结果为158H;
    但158H在8位寄存器中放不下;
    此时al的值为58H;
    由于寄存器ax的低位被当成单独的寄存器al使用,此时高位ah中不会保存al中存不下的值;
    2】进行数据传送或运算时,指令的两个操做对象的位数应该一致;
    例如:mov ax,bl 是不正确的指令,由于ax是16位寄存器,而bl是8位寄存器;
 
5.物理地址
每个内存单元都有一个惟一的地址,该地址称为物理地址;
cpu经过地址总线送入储存器的必须是一个内存单元的物理地址;
在cpu向地址总线上发出物理地址以前,必需要在内部造成这个物理地址;
不一样的cpu造成物理地址的方式可能不一样;
 
1)16位cpu
8086cpu是16位cpu;
16位cpu的结构特性:
    1】运算器一次最多能够处理16位的数据;
    2】寄存器的最大宽度为16位;
    3】计算器和运算器之间的通路为16位;
也就是说,8086cpu能一次处理、传输、暂时储存的信息最大长度为16位;
内存单元的地址在送上地址总线以前,必须在cpu中处理、传输、暂时储存;
 
2)物理地址造成的方式
以16位的8086cpu为例;
8086cpu有20位的地址总线,寻址能力有1MB;
而8086cpu是16位的,一次只传输16位地址信息;直接使用会形成资源浪费;
如上图所示,8086cpu的物理地址造成方式:
    1】物理地址由段地址和偏移地址组成;
    2】经过地址加法器,将16位的段地址和偏移地址合成一个20位的物理地址;
    3】物理地址经过地址总线传输进行寻址;
    4】计算公式为:
        物理地址 = 段地址 * 16 + 偏移地址;
    5】段地址 * 16 至关于将段地址左移四位;
 
3)段的概念
cpu自己并不给内存分段;
编程时根据须要,能够将若干连续的内存看作一个段;
段地址 * 16 来做为段的起始地址;
偏移地址来定位段中的内存单元;
因为段地址的起始位置是段地址 * 16 来获取的,所以段地址的起始位置必然是16的倍数;
偏移地址有16位,也就是是寻址能力为2的16次方即64kb,所以一个段的最大长度为64kb;
 
8086cpu在访问内存单元时,只在意物理地址,而不在意物理地址是如何组成的;
例如:访问21F60H的内存单元,可有多种方式;
    段地址:2000H    +    偏移地址:1F60H;
    段地址:2100H    +    偏移地址:0F60H;
 
物理地址的描述方式
    好比描述数据在21F60H内存单元中可有两种表达方式:
        1】数据在内存2000:1F60单元中;
        2】数据在内存的2000H段中的1F60单元中;
 
6.段寄存器
段寄存器用来存放段地址;
8086cpu有4个段寄存器:CS、DS、SS、ES;
当8086cpu要访问内存时,由这4个段寄存器提供段地址;
 
7.CS和IP
CS和IP是8086cpu中的两个最关键的寄存器,用来指示cpu当前要读取指令的地址;
cs是段寄存器,ip是指令指针寄存器;
 
在任意时刻,8086cpu将cs:ip指向的内容当作指令来执行;
例如:cs中的内容为m,ip中的内容为n,8086cpu将从内存 m*16+n 单元开始读取下一条指令;
 
8086cpu的工做过程简要描述:
    1】从cs:ip指向的内存单元读取指令,读取的指令进入进入指令缓冲器;
    2】ip=ip+所读取指令长度,从而指向下一条指令;
    3】执行指令,重复上述流程;
 
8086cpu刚启动或复位时,cs=FFFFH,ip=0000H;
也就是说内存单元FFFF0H处的指令为开机后执行的第一条执行指令;
 
数据和指令都是二进制码,cpu区分两者的方式为将cs:ip执向的内容做为指令;
也就是说执行过的指令都被cs:ip指向过;
 
1)修改cs、ip的指令
程序经过修改寄存器的值来控制cpu;
cpu从何处执行指令是由cs、ip来决定的;
能够经过改变cs、ip的值来控制cpu执行目标指令;
 
8086cpu经过传送指令mov来改变大多数寄存器的值;
但mov没法修改cs、ip的值;
修改cs、ip值的指令称为转移指令;
最简单的转移指令:jmp;
 
jmp 段地址:偏移地址    ->用指令中的段地址修改cs,用指令中的偏移地址修改ip;
    例如:cpu从2AE33H处读取指令
jmp 2AE3:3
 
jmp 某一合法寄存器    ->用寄存器中的值修改ip
    例如:将寄存器ax中的值赋给ip
jmp ax
 
2)代码段
对于8086cpu,能够根据须要将一组内存单元定义为一个段;
段的起始地址位16的倍数,且段的长度最大为64k;
能够将长度为N(N<=64)的一组代码存放在地址连续且起始地址为16的倍数的内存单元中,这段内存是用来放代码的,称为代码段;
 
例如:
上面的指令长度为10个字节;
能够存放在123B0H到123B9H的内存单元中;
那么123B0H到123B9H这段内存就是一个代码段;
段地址为123BH,长度为10个字节;
若是要执行这段指令,必须用cs:ip指向所定义代码段中第一条指令的首地址;
能够设定cs=123BH,ip=0000H;