微型计算机原理及应用【8086技术总结】

学习地址:https://blog.csdn.net/eminemdsp/article/details/51901532

               https://wenku.baidu.com/view/63b85216c5da50e2524d7ff3.html

               http://www.docin.com/p-568557212.html

1.【第一章计算机基础知识】

1.微型计算机由哪些功能部件组成?

     微型计算机由微处理器CPU,一定容量的内部存储器(包括)

 

 

2.通用寄存器:

                      

       1. 【AX,BX,CX,DX 称作为数据寄存器:】

              AX (Accumulator):累加寄存器,也称之为累加器;

    BX (Base):基地址寄存器;

    CX (Count):计数器寄存器;

    DX (Data):数据寄存器;

       2.【SP 和 BP 又称作为指针寄存器:】

             SP (Stack Pointer):堆栈指针寄存器;

             BP (Base Pointer):基指针寄存器;

 

       3.【SI 和 DI 又称作为变址寄存器:】

    SI (Source Index):源变址寄存器;

    DI (Destination Index):目的变址寄存器;

       控制寄存器:

                   IP (Instruction Pointer):指令指针寄存器;

                   FLAG:标志寄存器;

        段寄存器:

    CS (Code Segment):代码段寄存器;

    DS (Data Segment):数据段寄存器;

    SS (Stack Segment):堆栈段寄存器;

    ES (Extra Segment):附加段寄存器;

通用寄存器:

    从上面可以知道,在 8086 CPU 中,通用寄存器有 8 个,分别是 AX,BX,CX,DX,SP,BP,SI,DI ,

    至于为什么给它们取名做通用寄存器,那是因为,这些个寄存器每一个都有自己专门的用途,

    比如 CX 作为计数寄存器,则是在使用 LOOP 指令循环时用来指定循环次数的寄存器,

    如果它们每一个都只有一个专用的作用,那就它们只能称之为专用寄存器了,

    正是因为这些个寄存器还可以用来传送数据和暂存数据,所以才称它们为通用寄存器 。

【介绍讲解】:

                      

       数据寄存器(AX,BX,CX,DX):

      数据寄存器有 AX,BX,CX,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 位寄存器使用时,可以看做它们是互不相关的,也就是看做两个完全没有联系的寄存器 X 和 Y 即可,比如指令   MOV   AH , 12H ,CPU 在执行时根本就不会知道 AL 中是什么鬼东西,因为它只认识  AH 。

    下面给出一幅 16 位数据寄存器的结构图:

    表示 16 位 寄存器 AX 可以表示成两个 8 位寄存器,

    其中 AH 表示高位的 8 位寄存器,AL 表示低位的 8 位寄存器 。

                                                                                                                                                                  

AX
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
                           AH                 AL

                                                                                   

8086 CPU 访问内存(物理地址):

     当 CPU 需要访问一个内存单元时,需要给出内存单元的地址,而每一个内存单元在物理内存空间中都有一个唯一的地址,即可以通过这个地址定位到内存单元,而这个地址即为物理地址。

CPU 通过地址总线将一个内存单元的物理地址送入存储器,而后 CPU 便可以通过这个物理地址来访问这个物理地址所指向的内存单元了。那么这个物理地址在 CPU 中是如何形成的呢?

       首先,我们知道 8086 CPU 的地址总线是 20 根,即每次都可以传输 20 位的地址,从而寻址能力有 220 也就是 1MB 的大小,但是 8086 CPU 的寄存器只有 16 位,也就是在 8086 CPU 的内部,

一次性处理,传输,暂存的地址都只能是 16 位,即 8086 CPU 不能完整的保存下一个物理地址(物理地址为 20 位),如果单单以最简单的方式(即直接用 16 位寄存器来保存物理地址)的话,那么,寻址能力只有 216 ,也就是 64KB,如果真以如此简单的方式的话,那么地址总线还需要 20 根干嘛呢?而且,难不成我们以后的内存就是 64KB 了吗?

       当然不是的,8086 CPU 在这里采取了一定的措施从而使其寻址能力达到 1MB 。8086 CPU 在内部通过两个 16 位的地址进行合成从而形成一个 20 位的物理地址,由此,8086 CPU 的寻址能力便可以达到 1MB 。

[So]【那么 8086 CPU 又是如何将两个 16 位的地址合成为一个20 位的物理地址的呢?】

    当 CPU 在访问内存时,其会使用一个 16 位的基地址,然后再使用一个 16 位的偏移地址,通过将基地址和偏移地址传入 8086  CPU 的地址加法器中进行合成即可以构造出 20 位的物理地址。

至于合成的方式如下:

    基地址其实是通过一个 16 位的段地址来形成的,将一个段地址左移 4 位即形成了基地址,

而至于偏移地址的话,自然不必多说,为 16 位,通过将基地址和偏移地址相加便形成了 20 位的物理地址 。

下面给出一幅示意图来表示物理地址的合成:

段:

     至于段的话,其实在物理内存中是没有段这一概念的,事实上,段的概念来自于  CPU ,因为 CPU 拥有段寄存器,既然在 CPU 中拥有了段寄存器,自然,在 CPU 中就肯定有段的概念了,其实段也就是在编程时,我们将若干个地址连续的内存单元看做是一个段,然后通过将一个段地址左移 4 位形成基地址,再通过这个基地址来定位这个段的起始地址,然后,再通过偏移地址便可以精确定位到段中的内存单元了,由于段的起始地址是一个段地址左移 4 位,所以很明显,段的起始地址肯定是 16 的倍数,而且由于一个段内部,只能通过偏移地址来定位,而偏移地址为 16 位,所以一个段的长度也就是 216 也就是 64KB 的大小。

在编程时,可以讲一段内存定义成为一个段,而这里,我们又可以引出数据段,代码段,栈段这三种类型的段 。何为数据段呢?

    其实就是我们自个儿定义一段内存(当然段起始地址肯定是 16 的倍数,并且段长度 <= 64KB),然后我们在这个段里头存放我们所需要使用的数据,这就是数据段;

何为代码段呢?

    其实也很简单,也是我们自己在编程的时候定义一段内存,然后这段内存用来存放我们的代码(也就是指令),既然是存放的代码,自然就称之为代码段;

何为栈段呢?

    至于栈段的话,有接触过数据结构的朋友应该是很清楚栈的,而这里我们也就是在内存中分配出一个段,然后将这个段当做栈来使用,对于栈的介绍,详见下文;

                        这里呢,顺便还点出几个关于段寄存器的内容,当然下文还会详细介绍的,首先,对于任何一个段来说,均有段地址,而这些段地址是存放在段寄存器中(段寄存器的作用也在于此),但是对于不同的段,它们默认的段地址存放在不同的段寄存器中,像数据段来说,它的段地址存放在  DS (Data  Segment)寄存器中,代码段的段地址存放在  CS (Code  Segment)寄存器中,栈段的段地址存放在  SS (Stack  Segment)寄存器中 。

下面给出一幅在段中寻址的示意图:

栈:

8086  CPU 中提供了对栈的支持,并且其还提供了相应的指令来以栈的方式访问内存空间 。

   什么是栈?

    通过上面在段中的介绍,栈其实就是一个段,再说白一点,也就是一块内存,当然,这块内存是一块连续的内存 。既然栈是一个段的话,那么当然就可以以使用段的方式来使用栈,当然,除了像段一样的使用栈以外,栈还提供了其特殊的访问方式(如果和段一模一样的话,那还需要栈干吗呢?),众所周知,栈是先进后出类型的数据结构,在 8086  CPU 中也是如此,可以通过 ”PUSH“  指令将数据压入栈中,然后再通过 ”POP“  指令将栈顶的元素取出来 。

下面给出一幅示意图来描述栈:

     

 

 支付宝扫一扫有惊喜哦!

 

 

 

 

 

 

                                                                                     


 
 

posted @ 2018-09-09 20:46  Justice-V  阅读(1550)  评论(0)    收藏  举报