了解汇编语言之寄存器

来源:互联网 发布:飞鹰网络电视直播软件 编辑:程序博客网 时间:2024/05/20 12:48

   一个典型的CPU有运算器,控制器,寄存器(CPU工作原理)等器件构成。在CPU中,运算其进行信息处理,寄存器进行信息存储,控制器控制各种器件进行工作,内部总线连接各种器件,在他们之间进行数据的传递。其中,对于一个汇编程序员来说,CPU中的主要部件是寄存器,因为寄存器是CPU中程序员可以用指令读写的部件,程序员通过改变各种寄存器中的内容实现对CPU的控制。不同的CPU,其寄存器的个数,结构是不相同的,例如,8086CPU有14个寄存器,每个寄存器有一个名称,分别是AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW.

   8086寄存器CPU的所有寄存器都是16为的,可以存放两个字节,ax,bx,cx,dx,这四个寄存器通常用来存放一般性的数据,所以被称为通用寄存器,为了兼容上一代8位的寄存器,这四个寄存器都可分为两个可独立使用的噩为寄存器来用:即(AH,AL)(BH,BL)(CH,CL)(DH,DL)。出于兼容性的考虑,8086CPU可以一次性处理两种尺寸的数据(8位字节和16位字),其次了解一些基本的汇编指令(mov,add,sub).

   在CPU访问内存单位时,要给出内存单位的地址,所有的内存单元构成的存储空间构成一个一维的线性空间,每个内存单元在这个空间中都有位移的地址,我们将这个位移的地址称为物理地址。因此,CPU向地址总线发出物理地址之前,必须要在内部先形成这个物理地址,那么8086CPU是如何在内部形成内存单元的物理地址的呢?8086CPU有20为地址总线,可以传送20为地址,达到1MB寻址能力,但是8086CPU优势16为结构,所以它采用一种在内部用两个16为地址合成的方法来形成一个20位的物理地址,其中需要用到一个地址加法器,采用物理地址=段地址X16+偏移地址来合成物理地址。其实,要注意的是段的概念,内存并没有分段,段的划分来自与8086CPU用“物理地址=段地址X16+偏移地址”的方式给出内存单元的物理地址,是的我们可以用分段的方式来管理内存。有两点注意的是,段地址X16必然是16的倍数,所以一个短的其实地址也一定是16的倍数;偏移地址为16为,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB。

  了解到段地址的概念,那么是什么部件提供段地址?8086寄存器中有4个段寄存器:CS,DS,SS,ES,当CPU访问内存时由这4个段寄存器提供内存单元的段地址。

   首先,CS和IP是8086CPU中两个最关键的寄存器,它们知识了CPU当前要读取指令的地址,cs为代码段寄存器,IP为指令指针寄存器,从名称上我们可以看出他们和指令的关系。其中的大概过程为从cs:ip指向的内存单元读取指令,读取的指令进入指令缓冲器;IP=Ip+所读指令的长度,从而指向下一条指令;执行指令,并重复以上过程。在8086CPU加电启动或复位后(即CPU刚开始工作时)cs和IP被设置为cs=FFFFH,IP=0000H,即在8086 PC机刚启动是,CPU从内存FFFF0H单元中读取指令执行,FFFF0H单元的指令是8086PC及开机后执行的第一条指令。了解到这里,就可以清楚的知道CPU根据什么将内存中的信息看作指令?我们可以说,CPU将CS:IP指向的内存单元中的内容看作指令。那么,怎样修改CS,IP的指令呢?在CPU中,程序员能够用指令读写的部件只u哟寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。所以,我们可以用到一个最简单的看可以修改CS,IP的指令:jmp指令。若i想修改CS,IP中的值,可用形如“jmp 段地址:偏移地址”的指令完成;若想仅修改IP的内容,可用形如“jmp 某一合法寄存器”的指令完成。

   其次,CPU要都读写一个内存单元的时候,必须先给这个内存单元的地址,8086CPU中有一个DS寄存器,通常用来存放要访问的段地址,比如我们要读取10000H单元的内容,可以用如下的程序段:mov bx,1000H         mov ds,bx         mov al,[0];前面我们使用mov指令可以完成两种传送(将数据直接送入寄存器;将一个寄存器中的内容送入另一个寄存器),也可以使用mov指令将一个内存单元中的内容发送入到一个寄存器,此时的格式应该是: mov 寄存器名,内存单元地址。所以上述的程序段所讲的意思是,先将段地址通过一个通用寄存器间接传入到DS寄存器,在通过偏移量来访问在段中的字节内存。还有要注意的是,8086CPU是16位地址,可以一次性传送16位的数据,也就是可以一次性传送一个字,只要在mov指令中给出16位的寄存器就可以进行16位数据的传送了。

   最后,8086CPU提供入栈和出栈指令,最基本的两个是PUSH(入栈)和pop(出栈),比如,push ax 表示将寄存器ax中的数据送入栈中,pop ax表示栈顶取出数据送入ax.8086CPU的入栈和出栈都是以字为单位进行的,那么,CPU是如何指导栈顶的位置?显然,也应该有相应的寄存器来存放栈顶的地址,8086CPU中,有凉饿寄存器,段寄存器SS和寄存器sp,栈顶的段地址存放在ss中,偏移地址存放在sp中。任意时刻,ss:sp指向栈顶元素,push指令和pop指令执行是,CPU从ss和sp中得到栈顶的地址。

  

原创粉丝点击