汇编语言程序设计(二)CPU工作原理
作者:互联网
目录
CPU概述
- CPU由运算器、控制器、寄存器等组成,这些器件靠内部总线相连,外部总线则负责实现CPU和主板上其它器件的联系。
- 8086有14个寄存器,其中8个通用寄存器,寄存器都是16位的。
- AX、BX、CX、DX用来存放一般性数据,被称为通用寄存器。这四个寄存器可以分为两个独立的8位寄存器使用。比如AX可以分为AH和AL。
汇编指令例子
- 汇编指令不区分大小写
物理地址
- 所有的内存单元构成的存储空间在逻辑上是一个一维的线性空间,这个唯一线性空间的索引我们称之为物理地址。
- 决定一个CPU是16位的,是因为以下三点:
** 运算器依次最多处理16位的数据
** 寄存器的最大宽度是16位
** 寄存器和运算器之间的通路是16位的 - 8086有20位地址空闲,寻址能力位1M,但是8086内部为16位结构,只能传送16位的地址,表现出的寻址能力只有64K,怎么把16位的数据转换成20位的地址?用两个16位地址(段地址和偏移地址)合成一个20位的物理地址。段地址和偏移地址通过内部总线送入一个称为地址加法器的部件,地址加法器将两个16位地址合并成一个20位地址。
- 物理地址 = 段地址✖16 + 偏移地址,段地址乘以16相当于乘以2^4,相当于左移4位,因此得到了一个20位的地址,再加上偏移地址,得到最终的物理地址。一个数据的X进制形式左移一位,相当于乘以X。对于同一个物理地址,可能有好几种段地址和偏移地址对可以来表示它,具体用的哪种是CPU决定的,不可知。
段的概念
- 错误认识:内存被划分成一个一个的段,每个段有一个段地址。这是错误的,内存并没有分段,只是从CPU的角度可以用分段的方式来管理内存。在编程时,可以根据需要将若干地址连续的内存单元看成一个段,用段地址✖16来定位段的起始地址,用偏移地址定位段中的内存单元。以下两点注意:
- 段寄存器就是用于管理段地址的,8086CPU中有4个段寄存器,CS代码段寄存器、DS数据段寄存器、SS堆栈段寄存器、ES附加段寄存器。
- CS和IP是8086CPU中最关键的寄存器,它们指示CPU当前要读取指令的地址。CS是代码段寄存器,IP是偏移,被称为指令指针寄存器。8086工作过程如下:
** 从CS:IP指向的内存单元读取指令,该指令进入指令缓冲器
** IP = IP + 所读取指令的长度,从而指向下一条指令,IP是有一个自加器的,可以自动指向下一条指令。
** 执行指令,转到第一步重复这个过程
** 在8086加电启动或复位后,CS和IP被设置称CS=FFFFH,IP=0000H,CPU从内存FFFF0H单元中读取指令执行,这条指令是8086PC机开机后执行的第一条指令
** 不能用传送指令MOV来改变寄存器CS和IP的值,8086CPU为CS和IP提供了另外的指令来改变他们的值,即转移指令JMP,用指令中给出的段地址修改CS,偏移地址修改IP,可以同时修改
- 对于8086PC机,编程时可以根据需要将一组内存单元定义为一个段,可以将长度为N<=64KB的一组代码存放在一组地址连续、起始地址为16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段。将CS:IP指向段首地址,就可以执行这段程序了,CPU只认被CS:IP指向的内存单元中的内容为指令。
标签:16,汇编语言,IP,地址,指令,寄存器,程序设计,CPU 来源: https://www.cnblogs.com/chkplusplus/p/16278725.html