《8086CPU寄存器简介》由会员分享,可在线阅读,更多相关《8086CPU寄存器简介(29页珍藏版)》请在金锄头文库上搜索。
1、引子打算写几篇稍近底层或者说是根底的博文,浅要介绍或者说是回忆一些根底知识,自然,还是得从最根底的开始,那就从汇编语言开刀吧,从汇编语言开刀的话,我们必须还先要了解一些其他东西,像 CPU ,内存这些知识点还是理解深刻一点的比拟好,所以这一篇博文就绕着 80x86 CPU中存放器的根底局部下手,至于其他的一些将会在后续的博文中介 绍。同时在这里说明一下,本篇博文介绍的算是比拟详细的了,而且介绍的知识点也是比拟多的,所以造成博 文长度过长,如果有兴趣想了解这一块的话,还请自行斟酌好阅读比例,建议分3次以上阅览。、土 板.d块者7E位本博文主要将介绍的是8086 CPU中的存放器,既然是 8086
2、 CPU存放器简介的话,自然,面向的是初级一些的读者,其中不会涉及太多难点,同时,所有的介绍,我也会尽可能的从根底开始,然后循序渐进的介绍,同时也会尽量的将知识点介绍详细,介绍的过程中也会涉及到一些汇编程序代码,当然,采用的是最简单的方式介绍而已,本篇博文也就是回忆一些根底知识,读者主要定位于想对8086 CPU有所了解,希望对整个程序设计的底层有所了解的朋友,而且读者最好是拥有一定的计算机根底和汇编语言根底。开头首先浅要介绍一下 Intel CPU的开展史吧:Intel CPU系列,最初是 4位微处理器 4004,然后到到8位微处理器的 8008 ,再到8微微处理器8080,以及稍后的16位
3、微处理器8086,由8086开始,Intel进入现在所谓的x86 时代。Intel 8086为16位 CPU,而因为在 8086之前的CPU都是8位CPU,这样也就造成了很多的外 设也只支持8位,因此Intel 紧接着就退出了 8位的8088 CPU,因此 Intel 8088 也就可以看做是 8086的8位版本;如果是但从汇编语言的角度上来说,8086和8088是没有区别的,即8086上跑的程序可以不加修改的移植到8088 ,8088上跑的程序也可以不加修改的移植到8086上,当然,还是有些特殊的地方是不同的,而这些根本上在这里可以忽略掉,在8088 CPU之后,Intel 又推出了 801
4、86 , 80286,这两款 CPU均是16位 CPU ,而对于80186来说,其与8086的区别可以简单的看做是80186多了几条指令而已,而80286那么不同,80286的地址总线数目有了变化,在8086,8088,80186 上,CPU的地址总线都是 20根,即可最大寻址 220即到达1MB的寻址能力, 而对于80286 CPU来说,其地址总线数目到达了24根,从而最大寻址能力为224即16MB,由于支持更多的物理内存寻址,因此 80286便开始成为了多任务,多用户系统的核心。而后来,Intel 又推出了 80386 , 80386为32位微处理器,Intel 80x86家族的32位微处
5、理器始于 80386 ;同时80386 也完全兼容先前的 8086/8088 , 80186 , 80286 ,并且80386 全面支持 32位数据类型和 32 位操作,并且80386的数据总线根数和地址总线根数均到达了32根,从而可以最大物理寻址为232即4GB。而之后的80486也是32位微处理器,而后又出来了 Pentium 和Pentium Pro等等第五代微处理器,这些处理器虽然也是32位微处理器,但是他们的数据总线和地址总线都有所扩展,比方Pentium 的数据总线到达 64位,而Pentium Pro的地址总线位数到达了36位。好,关于Intel CPU的介绍就到这里了,下面就要
6、开始回归中心,看 CPU中的存放器了,首先,从学习的角度来说,从 8086/8088 CPU下手是不错的选择,而我这里选择的也是8086 CPU而已,说实在的,像 80386 CPU我也还没有研究过,像奔腾这些,呵呵,扯更远了,说到底也就只能拿 8086出来晒晒而已,当然,从 8086开始也是学习的最正确路径。说了这么久,到底存放器是什么呢?其实很简单,存放器就是个存储信息的单元或者说是器件又或者说是容器而已,就比方内存也是一个存储介质或者说是存储单元而已,其实存放器从理解上来说和内存差不多,只不过存放器(这里讨论的存放器都是CPU中的存放器,不包括外设上的存放器)位于 CPU内部,而内存位于
7、CPU外部,而且,存放器比内存可是珍贵得多啊,就拿内存和硬盘来比,肯定是内存在使用上珍贵得多,是PC中的稀有资源,而存放器是 CPU中的稀有资源,内存和存放器相比就像硬盘和内存相比一样。而对于一个汇编程序员来说,CPU中主要可以使用的也就是存放器而已,汇编程序员可以使用指令来读写CPU中的存放器,从而可以实现对于 CPU的控制,当然,不同的 CPU ,存放器的个数和结构都是不一样的,比方8086 CPU中,存放器的个数也就14个而已,并且8086 CPU中所有的存放器的结构为16位,即一个存放器中可以存放下2B即2个字节,而到了 80386 CPU中,存放器的个数也比8086增多了,比方在 8
8、0386中添加了系统地址存放器等寄存器,同时存放器的结构也变了,比方在 80386中绝大多数的存放器为 32位,而有些存放器那么是16位。8086 CPU中存放器总共为 14个,且均为16位。即 AX, BX, CX, DX, SP, BP , SI , DI , IP , FLAG , CS, DS, SS, ES 共 14 个。而这14个存放器按照一定方式又分为了通用存放器,控制存放器和段存放器。通用存放器:AX , BX, CX, DX称作为数据存放器:AX (Accumulator):累加存放器,也称之为累加器;BX (Base):基地址存放器;CX (Count):计数器存放器;DX
9、 (Data):数据存放器;SP和BP又称作为指针存放器:SP (Stack Pointer):堆栈指针存放器;BP (Base Pointer):基指针存放器;SI和DI又称作为变址存放器:SI (Source Index):源变址存放器;DI (Destination Index):目的变址存放器;控制存放器:IP (Instruction Pointer):指令指针存放器;FLAG:标志存放器;段存放器:CS (Code Segment):代码段存放器;DS (Data Segment):数据段存放器;SS (Stack Segment):堆栈段存放器;ES (Extra Segment
10、):附加段存放器;通用存放器从上面可以知道,在 8086 CPU中,通用存放器有 8个,分别是 AX, BX, CX, DX, SP, BP, SI , DI , 至于为什么给它们取名做通用存放器,那是因为,这些个存放器每一个都有自己专门的用途, 比方CX作为计数存放器,那么是在使用LOOP指令循环时用来指定循环次数的存放器,如果它们每一个都只有一个专用的作用,那就它们只能称之为专用存放器了,正是因为这些个存放器还可以用来传送数据和暂存数据,所以才称它们为通用存放器。下面就按顺序来一一介绍这几个通用存放器了 :数据存放器(AX , BX , CX, DX):数据存放器有 AX, BX, CX,
11、 DX四个组成,由于在8086之前的CPU为8位CPU,所以为了兼容以前的 8位程序,在8086 CPU中,每一个数据存放器都可以当做两个单独的存放器来使用,由此,每一个16位存放器就可以当做 2个独立的8位存放器来使用了 。AX存放器可以分为两个独立的8位的AH和AL存放器;BX存放器可以分为两个独立的8位的BH和BL存放器;CX存放器可以分为两个独立的8位的CH和CL存放器;DX存放器可以分为两个独立的8位的DH和DL存放器;除了上面4个数据存放器以外,其他存放器均不可以分为两个独立的8位存放器;注意在上面标志中的 独立二字,这两个字说明 AH和AL作为8位存放器使用时,可以看做它们是互不
12、相关的,也就是看做两个完全没有联系的存放器X和Y即可,比方指令MOV AH , 12H ,CPU在执行时根本就不会知道 AL中是什么鬼东西,因为它只认识 AH下面给出一幅16位数据存放器的结构图:表示16位存放器AX可以表示成两个 8位存放器,其中AH表示高位的8位存放器,AL表示低位的8位存放器。AX存放器:2个独立的8位存放器如上所说,AX的另外一个名字叫做累加存放器或者简称为累加器,其可以分为AH 和 AL;在写汇编程序时,AX存放器可以说是使用率最高的存放器不过,总共才那么14个存放器,哪一个不经常使用咯?, 既然AX是数据存放器的话,那么理所当然,其可以用来存放普通的数据,由于其是1
13、6位存放器,自然也就可以存放 16位数据,但是因为其又可以分为2个独立的8位存放器 AH和AL ,所以,在 AH和AL中又可以独立的存放 2个8位的数据, 可以有以下代码即将 AX当做普通的存放器使用,即可以用来暂存数据:MOV AX,1234HMOV AH,56H;向存放器AX传入数据1234H;向存放器AX的高8位存放器AH中传入数据56HMOV AL,78H;向存放器 AX的低8位存放器 AL中传入数据78H3条语句的执行过程如下:BX-0000ES=8C44时S6ex-0010 DK-0000 SP-0000S=GC5-1 CS=0CS IP-0003NOU 计 LS6BP0000 S
14、i-0000 DI-0000NU UP El PL HZ NA PO HCBX=0000ES 冲 C44B0?85634CX=0010SP=30同0SS=0C51 CS=0C54IP-0005MOU RL.?8BP=0000 Si =6000 DINU UP El PL HZ Nfi PO NCX =BX =0000sES =0C44BP=0000 1-S000 DI=0000HU UP El PL HZ NA PO HCCX=0010 DK=0000 SP=000BSS=GC54 CS-0C54 IP=000?nou AX0CSJsenary. xiaoZiHen而既然AX又被称作为累加器,
15、自然其还有一点点特殊的地方的: AX存放器还具有的特殊用途是在使用DIV和MUL指令时使用,DIV在8086 CPU中是除法指令,而在使用除法的时候有两种情况,即除数可以是8位或者是16位的,而且除数可以存放在存放器中或者是内存单元中,而至于被除数的话,自然,应该由AX来代替了,当除数是8位时,被除数一定会是 16位的,并且默认是放在 AX存放器中, 而当除数是16位时,被除数一定是32位的,因为AX是16位存放器,自然,放不下32位的被除数, 所以,在这里还需要使用另一个16位存放器DX ,其中DX存放32位的被除数的高 16位,而AX那么存放32位的被除数的低16位, 同时,AX的作用还不仅仅是用来保存被除数的,当除法指令执行完成以后, 如果除数是8位的,那么在 AL中会保存此次除法操作的商,而在 AH中那么会保存此次除法操作的余数, 当然,如果除数是 16位的话,那么 AX中会保存