一:CPU工作原理
1.一个典型的CPU由运算器,控制器,寄存器等器件组成,这些器件靠内部总线相连.(内部总线实现CPU内部各个器件之间的联系,外部总线实现CPU和主板上其它器件的联系)
2.以8086CPU为例,其有14个寄存器,名称分别为:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW.
3.AX,BX,CX,DX,通常用来存放一般性数据,被称为通用寄存器.
以AX为例
其以二进制的形式,一个格存一位数,因此16位最大的存储数据为(2^16)-1.
因为8086上一代的CPU中的寄存器都是8位的,为了保证兼容,这四个寄存器都可以分为两个独立的寄存器使用
如AX可以分为AH(高8位,第8位~第15位)和AL(低8位,第0位-第7位),BX可以分为BH和BL,以此类推.且高位和低位的寄存器都可以看成能够独立使用的8位寄存器.
4.汇编指令
mov指令:
mov 寄存器1, 数据(或者寄存器2) : 将数值(或寄存器2中的值)赋给寄存器1,如: mov ax,18(bx) 即将18(bx的值)赋给ax寄存器,类似于 ax = 18(bx)
add 指令:
与mov大致相同,将mov的赋值功能改为了相加,如:add ax,18(bx) 即将18(bx的值)加到ax上 类似于 ax +=18(bx)
5.物理地址
CPU访问内存单元时要给出内存单元的地址.所有的内存单元构成的存储空间是一个一维的线性空间,将这唯一的地址称为物理地址.
6.以8086CPU为例,其运算器一次最多可以处理16位的数据,寄存器的最大宽度为16位,寄存器和运算器之间的通路为16位.8086有20位的地址总线,可以传输20位的地址,但是其内部却为16位的结构,他只能传送16位的地址
7.以8086CPU为例,使用内部16位的数据,转换成20位的地址,如图所示:
其物理地址 = 段地址 * 16 + 偏移地址
例如: 段地址 = 1234H , 偏移地址 = 0001H, 则段地址和偏移地址通过地址加法器来进行运算,1234H乘以16相当于,向左移一位(二进制则是左移四位刚好20位),因为其是16进制,即12340H+ 0001H =12341H
一个N进制的数左移1位,相当于乘以N,左移X位,相当于乘以(N^X).
8.段的概念
内存被划分成一个个的段,每个段都有一个地址是错误的认知
实际上,内存并没分段,段的划分来自CPU,由于8086CPU使用:物理地址 = 段地址 * 16 + 偏移地址 来给出内存单元的物理地址,使得我们也可以用这种方式来管理.我们可以根据编程的需要,将若干个地址连续的内存单元看做一个段,用段地址16 来定位段的起始地址,用偏移地址来定位段中的内存单元
如:21F60H=2000H16+1F60H, 表示,数据在2000段中的1F60H单元中.
也可写为: 2000 : 1F60. 且CPU可以用不同的段地址和偏移地址形成同一个物理地址 如21F60H也可以写为:21F60H = 21F0H*16 + 0060H,表示数据在21F0段中的60单元中.
9.以8086CPU为例,段寄存器有4个:CS, DS, SS, ES, 当CPU要访问内存时,由这四个段寄存器来提供内存单元的段地址
10.CS 和 IP 是 8086CPU最关键的寄存器, CS 为代码段寄存器, IP 为指令寄存器(偏移地址寄存器).他们指示了CPU当前要读取指令的地址(告诉CPU去哪里读地址),在CPU中程序员能够用指令读写的部件只有寄存器,可以通过改变寄存器中的内容来实现对CPU的控制
11.汇编指令:
jmp 段地址:偏移地址 ,修改CS 和 IP 的地址(跳到并访问相应的地址)
如: jmp 2000:1F60 跳到并访问21F60H.
jmp 一个合法的寄存器 ,使用寄存器中的值来修改IP,
如: jmp ax 将前段下的IP改为ax,即跳转到当前段下的ax
11.代码段
在编程时,可以根据需要,将一组内存单元定义为一个段,将一组代码存在地址连续起始地址为16的倍数的内存单元中,就是代码段.
代码段只是我们在编程的时候自己想出来的,CPU是认不出的,CPU只认识被CS:IP指向的内存单元中的地址指令
12.8086CPU的工作过程
(1)从CS:IP指向的内存单元中读取指令,读取的指令进入指令缓冲器
(2)IP指向下一条指令
(3)执行指令
重复这三个步骤.
13.DEBUG程序中的一些命令
R命令:查看,改变CPU寄存器的内容
D命令:查看内存中的内容
E命令:改写内存中的内容
U命令:将内存中的机器指令翻译成汇编指令
T命令:执行一条机器指令
A命令:以汇编的格式在内存中写入一条机器指令