1、基础概念

  寄存器:嵌入到CPU中的内存,也可以理解为CPU里面的存储器,一个CPU有多个寄存器;

  总线:连接CPU和其它芯片的导线;

  总线在物理上:是一根根导线的集合;逻辑上分为:地址总线、数据总线、控制总线

  地址总线:CPU通过地址总线来指定存储单元的。根据地址总线的根数来确定最大的寻址;

  数据总线:CPU与内存或其它器件的数据传送;数据总线的宽度决定了CPU和外界数据的传送速度;

  控制总线:用来控制外部器件;无非就是读/写;

  CPU可以直接使用的信息在存储器中存放;

  总结:地址总线决定CPU的寻址能力;数据总线决定一次数据传送量;控制总线决定CPU对其它器件的控制能力;

  主板上有核心器件和主要器件(他们通过地址、数据、控制)总线来连接;接口卡;

  存储器:(1)、读写属性分:随机存储器(RAM)、只读存储器(ROM);

  (2)、功能上分类:随机存储器(RAM)、装有BIOS的ROM、接口卡上的RAM;

  BIOS:主板、网卡、显卡、接口卡上都有的软件系统,通过这个可以对该硬件设备进行最基本的输入输出,

  内存地址空间:最终运行程序的是CPU,所以用汇编编程的时候,必须要从CPU的角度来考虑问题;

  计算机内部都是从0开始的;

  任何的指令、命令、数据,在计算机中都为二进制;


2、CPU的内部工作原理

  CPU由运算器、控制器、寄存器等组成;

  8086CPU有14个寄存器:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。

  8086CPU所有的寄存器都是16位的,可以存放2个字节;

  AX、BX、CX、DX通常用来存放一般性数据,所以被称为通用寄存器;

  AX可以分为:AH和AL;分高8位和低8位;BX、CX、DX也一样分高低位;

  为什么划分:为了兼容以前8位寄存器;

AX寄存器模型:

wKiom1gUzKDgKt6GAAAKJSNYOxw690.png-wh_50

AH和AL寄存器是可以独立使用的8位寄存器;


3、汇编指令

  一个字可以存在一个16位的寄存器中,word = 2B;

  add ax, bx  :将AX,BX中的内容相加,结果放到AX中;

  物理地址:CPU访问内存时要给出内存单元的地址,内存是一维、线性的连续空间;


4、16位的CPU怎么理解

  (1)、运算器(ALU)一次最多可以处理16位的数据;

  (2)、寄存器的最大宽度为16位;

  (3)、寄存器和运算器之间的通路是16位的;


5、地址加法器

  8086有20位的地址总线,可传送20位地址,寻址能力1M;但是内部为16位的结构,表现寻址能力却只有64k;

  原因:地址加法器合成物理地址的方法:物理地址 = 段地址*16+偏移地址(将2个16位的地址合成物理地址)

  对段地址*16的理解:就是数据左移4位(对二进制);

  可以得到一个规律:一个数据的X进制左移1位,相当于乘以X。


6、段

  本质:内存并没有分段,段的划分来自CPU,我们自己通过(段地址*16)+偏移地址来得到内存单元的物理地址,这才使得我们用分段的方式来管理内存。

  (1)、一个段的起始地址一定是16的倍数;

  (2)、一个段的最大长度为64K。

  结论:CPU可以用不同的段地址和偏移地址来形成同一个物理地址。


7、段寄存器

  (1)、段寄存器就是提供段地址的。

  (2)、8086CPU有4个段寄存器:CS、DS、SS、ES;当8086要访问内存时,由这4个段寄存器提供内存单元的段地址。

  CS:代码段寄存器;

  DS:数据段寄存器;

  SS:堆栈段寄存器;

  ES:附加段寄存器;


8、CS和IP

  (1)、CS和IP是8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址。

  CS:代码段寄存器;IP:指令指针寄存器(偏移地址的寄存器);

  此时,8086PC工作过程简要:

  i>、从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;

  ii>、IP = IP + 所读取指令的长度,从而指向下一条指令;(任务:索引到下一条指令)

  iii>、读取指令,一次这样执行工作;

  (2)、8086PC工作过程

  :在8086CPU加电启动或复位后(就是CPU刚开始工作时,)CS=FFFFH, IP=0000H。

  即刚启动时,CPU从内存FFFF0H单元读取指令执行。

  FFFF0H单元中的指令是8086开机执行的第一条指令。

  (3)、任何时候,CPU将CS、IP中的内容都当做指令的段地址和偏移地址,用他们来合成指令的物理地址,到内存中读取指令码执行。

  可以这么理解:内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必然被CS:IP指向过。

  (4)、可以修改CS:IP中的值来控制CPU的执行目标指令的地址。用jmp来修改段地址和偏移地址;如:jmp 2AE3:3


9、代码段

  存放代码的地方,CPU不认识代码段,怎么执行这里的代码呢?

  CPU只认被CS:IP指向的内存单元中的内容为指令;

  8086机器上,任意时刻,CPU将CS:IP指向的内容当作指令执行;


10、Debug汇编调试器

  在winxp系统上,cmd-->debug进入即可(不区分大小写的)。

  (1)、常用命令:

  R:查看、改变CPU寄存器的内容;

  D:查看内存中的内容;

  E:改写内存中的内容;

  U:将内存中的机器指令翻译成汇编指令;

  T:执行一条机器指令;

  A:以汇编指令的格式在内存中写入一条机器指令。

截图:

wKioL1gU4BDi-xpBAAAobR8zzXQ302.png-wh_50

wKioL1gU4LGRIb7BAAAuKpXE2eI918.png-wh_50

debug中的命令还的多加练习,熟悉即可!!!